Map接口
Map接口
一,前言
了解Map集合的特点,掌握Map集合的常用方法,Map集合的4种遍历方式,掌握集中常用的Map接口下实现类的子类集合
二,Map集合的特点
- Map并不是集合,而表示两个集合之间的一种关系,故Map没有实现Collection接口。
- A集合应该是一个Set集合,B集合应该是List集合。
- 我们把A集合中的元素称之为key,把B集合中的元素称之为value。
- Map其实就有多个key-value(键值对)组成的,每一个键值对我们使用Entry表示,Map结构也可以理解为是Entry的集合,即Set
。
三,Map集合的常用方法
增加方法:
boolean put(Object key,Object value):
存储一个键值对到Map中。
boolean putAll(Map m):
把m中的所有键值对添加到当前Map中。
删除方法:
Object remove(Object key):
从Map中删除指定key的键值对,并返回被删除key对应的value。
修改方法:
无专门的方法,可以调用put方法,存储相同key,不同value的键值对,可以覆盖原来的。
查询方法:
int size():
返回当前Map中键值对个数。
Object get(Object key):
返回Map中指定key对应的value值,如果不存在该key,返回null
boolean isEmpty():
判断当前Map中键值对个数是否为0。
boolean containsKey(Object key):
判断Map中是否包含指定key。
boolean containsValue(Object value):
判断Map中是否包含指定value。
Set keySet():
返回Map中所有key所组成的Set集合。
Collection values():
返回Map中所有value所组成的Collection集合。
Set<Entry> entrySet():
返回Map中所有键值对所组成的Set集合。
四,Map集合的遍历方式
1.keySet方法或者values方法
public void test() {
Map map = new HashMap();
// KeySet 获取key
for (Integer key : map.keySet()) {
System.out.println(key);
}
// values 获取value
for (Integer value : map.values()) {
System.out.println(value);
}
}
2.利用keySet get(key)方法
// keySet get(key) 获取key and value
public void testKeySetAndGetKey() {
for (Integer key : map.keySet()) {
System.out.println(key + ":" + map.get(key));
}
}
3.利用entrySet方法
// entrySet 获取key and value
public void testEntry() {
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
4. Iterator迭代器
public void testIterator() {
Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Integer, Integer> entry = it.next();
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
五,常用的Map集合
1.HashMap & Hashtable集合
- HashMap 和 Hashtable 是 Map 接口的两个典型实现类。
- Hashtable 、HashMap 也不能保证其中 key-value 对的顺序
- Hashtable 、HashMap 判断两个 Key 相等的标准是:两个 Key 通过 equals 方法返回 true,hashCode 值也相等。
- Hashtable 、HashMap 判断两个 Value相等的标准是:两个 Value 通过 equals 方法返回 true
区别:
- Hashtable 是一个古老的 Map 实现类,不建议使用。
- Hashtable 是一个线程安全的 Map 实现,但 HashMap 是线程不安全的。
- Hashtable不允许使用 null 作为 key 和 value,而 HashMap 可以。
例:(统计一个字符串中每隔字符出现次数)
public class HashMapDemo2{
public static void main(String[] args) {
String str = "ABCDEFABCDEABCDABCABA";
//把字符串转换为char数组
char[] charArray = str.toCharArray();
//Map的key存储字符,value存储出现的次数
Map<Character, Integer> map = new HashMap<>();
//迭代每一个字符
for (char ch : charArray) {
//判断Map中是否已经存储该字符
if (map.containsKey(ch)) {
Integer count = map.get(ch);
//如果已经存储该字符,则把出现次数加上1
map.put(ch, count+1);
}else {
//如果没有存储该字符,则把设置次数为1
map.put(ch, 1);
}
}
System.out.println(map);
}
}
2.TreeMap集合
TreeMap底层基于红黑树算法,因为Map中的key是Set,所以不能保证添加的先后顺序,也不允许重复,但是Map中存储的key会默认使用自然排序(从小到大),和TreeSet一样,除了可以使用自然排序也可以自定义排序。
例:
实力化TreeSet自定义排序Comparator方法:(如按类的年龄排序)
(Comparator方法,compare(T o1, T o2))
public void test(){
Comparator com = new Comparator(){
@Override
public int compareTo(Person o1,Person o2) {
if(o1 instanceof User && o1 instanceof User){
User u1 = (User)o1;
User u2 = (User)o2;
return Integer.compare(u1.getAge(),u2.getAge())
}else{
throw new RuntimeException("输入的数据类型不匹配")
}
}
TreeSet ts = new TreeSet(com);
for (ts.Entry<Integer, Integer> entry : ts.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
}
3. LinkedHashMap
- LinkedHashMap 是 HashMap 的子类.
- LinkedHashMap 可以维护 Map 的迭代顺序:迭代顺序与 Key-Value 对的插入顺序一致
六,Map集合总结
- Map 用于保存具有映射关系的数据,因此 Map 集合里保存着两组值,一组值用于保存 Map 里的 Key,另外一组用于保存 Map 里的 Value。
- Map 中的 key 和 value 都可以是任何引用类型的数据。
- Map 中的 Key 不允许重复,即同一个 Map 对象的任何两个 Key 通过 equals 方法比较中返回 false。
- Key 和 Value 之间存在单向一对一关系,即通过指定的 Key 总能找到唯一的,确定的 Value。
七,操作集合的工具类:Collections
1.特点
- Collections 是一个操作 Set、List 和 Map 等集合的工具类。
- Collections 中提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法
2.Collections集合常用的方法
排序操作:
reverse(List):
反转 List 中元素的顺序。
shuffle(List):
对 List 集合元素进行随机排序。
sort(List):
根据元素的自然顺序对指定 List 集合元素按升序排序。
sort(List,Comparator):
根据指定的 Comparator 产生的顺序对 List 集合元素进行排序。。
swap(List,int, int):
将指定 list 集合中的 i 处元素和 j 处元素进行交换。
查找、替换:
Object max(Collection):
根据元素的自然顺序,返回给定集合中的最大元素。
Object max(Collection,Comparator):
根据 Comparator 指定的顺序,返回给定集合中的最大元素。
Object min(Collection):
根据元素的自然顺序,返回给定集合中的最小元素。
Object min(Collection,Comparator):
根据 Comparator 指定的顺序,返回给定集合中的最小元素。
int frequency(Collection,Object):
返回指定集合中指定元素的出现次数。
boolean replaceAll(List list,Object oldVal,Object newVal):
使用新值替换 List 对象的所有旧值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通