Map家族
Map简介
1、Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value(双列元素)
2、Map中的key和value可以是任何引用类型的数据,会封装到HashMap $ Node对象中
3、Map中的key不允许重复,原因与HashSet中一样
4、Map中的value可以重复
5、Map的key可以为null,value也可以为null,但key中只能有一个null,value中可以有多个
6、常有String类作为Map的key
7、key与value之间存在一对一的单向关系,即通过指定的key总能找到对应的value
8、一对k-v是放在一个HashMap $ Node中的,因为Node实现了Entry接口,有些书上也说一对k-v就是一个Entry
关系图:

1)、k-v最后是HashMap $ Node node=newNode(hash,key,value,null)
2)、k-v为了方便程序员的遍历,还会创建EntrySet集合,该集合存放的元素类型Entry,而一个Entry对象就有k,v。
EntrySet<Entry<K,V>> (K:指向node节点的key,V:指向node节点的value。只是为了方便遍历,并未存储新数据)
即:transient Set<Map.Entry<k,v>> entryset;
3)、entrySet中,定义的类型是Map.Entry,但实际上存放的还是HashMap $ Node(Node实现了Map.Entry的接口)
4)、当把HashMap $ Node对象存放到entrySet就方便我们的遍历,因为Map.Entry提供了重要的方法:K getKey()和V getValue()
源码
Set set=map.entrySet();
System.out.println(set.getClass());//HashMap$EntrySet
for(Object entry:set){
System.out.println(entry.getClass());//HashMap$Node
//为了从HashMap$Node中取出k-v
//先做一个向下转型Object->Map.Entry
Map.Entry mentry=(Map.Entry) entry;
System.out.println(mentry.getKey()+mentry.getValur());
}
Map底层用一个table以数组+链表+红黑书组织HashMap$Node,为了方便管理把Node封装为entry,再将entry放到EntrySet中
MapFor(遍历)
| ①containsKey:查找键是否存在 | ②keySet:获取所有键 |
|---|---|
| ③entrySet:获取所有关系 | ④values:获取所有值 |
通过entrySet获取k-v
Set entrySet=map,entrySet();//EntrySet<Map.Entry<K,V>>
增强for
for(Object entry:entrySet){
//将entry转成Map.Entry(向下转型)
Map.Entry m=(Map.Entry)entry;
System.out.println(m.getKey()+m.getValue());
}//entrySet只需遍历map一次,效率更高
迭代器
Iterator iterator=entrySet.iterator();
while(iterator.hasNext()){
Object entry=iterator.next();
//System.out.println(next.getClass());
//HashMap$Node -实现-> Map.Entry
//向下转型Map.entry
Map.Entry m=(Map.Entry)entry;
System.out.println(m.getKey()+m.getValue());
}
本文深入解析Java中Map接口及其家族成员的特点与使用方法,包括HashMap、TreeMap等常见实现类的内部结构、特点及应用场景,重点介绍Map的遍历方式与高效使用技巧。
10万+

被折叠的 条评论
为什么被折叠?



