Map

本文深入解析Java中Map接口及其家族成员的特点与使用方法,包括HashMap、TreeMap等常见实现类的内部结构、特点及应用场景,重点介绍Map的遍历方式与高效使用技巧。

Map家族

Map
HashTable
HashMap
TreeMap
properties
LinkedHashMap

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());
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值