Map 接口和常用方法
1. Map 接口实现类的特点
这里讲的是JDK8的Map接口特点
- Map与Collection并列存在。用于保存具有映射关系的数据:
Key-Value
- Map中的key和value可以是任何引用类型的数据,会封装到
HashMap$Node
对象中 - Map中的key不允许重复,原因和HashSet一样
- Map 中的 value 可以重复
- Map的key可以为
null
, value也可以为null
,注意key为null
,只能有一个,value为null
,可以多个. - 常用
String
类作为Map的key - key和value之间存在单向一对一关系,即通过指定的key总能找到对应的value
- 当 key 相同时,就等价于替换
2. Map 接口源码分析
-
Map 接口的特点
-
Map存放数据的
key-value
示意图,一对k-v是放在一个HashMap$Node
中的, 因为Node
实现了Entry
接口,一对k- v
就是一个Entry
,Entry 再放到 EntrySet 里面
-
Key:Value 的类型:
Key(Set):Value(Collection)
-
真正的Key:Value 是放在
HashMap$Node
中,下面的 Set 和 Collection 集合只是指向了HashMap$Node
而已(引用),为了遍历方便
-
源码解读:
- k-v 最后是:
HashMap$Node node = newNode(hash, key, value, null);
- k-v 为了方便遍历,还会创建
EntrySet
(集合),该集合存放的元素的类型:Entry
,而一个Entry
对象就有k-v,EntrySet<Entry<k,v>>
查看 HashMap 源码可以发现,即:transi