Map接口
Map
用于保存键值对(key-value),其中key不允许重复。Map接口的继承树如下:
可以看到,Map
的子类层次与Set
很像,Set
接口下有HashSet
,LinkedHashSet
,SorterdSet
,TreeSet
,EnumSet
;相应的,Map
接口下有HashMap
,LinkedHashMap
,SortedMap
,TreeMap
,EnumMap
。Map
的这些实现类中key集的存储形式和对应的Set
中的元素的存储形式完全相同。
实际上,从源码看,Java是先实现了
Map
,然后通过包装一个所有value都为一个空对象的Map
就实现了Set
Java8改进的HashMap和Hashtable实现类
-
两个实现类的区别:
Hashtable
是一个古老的实现类,虽然线程安全,但是性能较低;相对的,HashMap
线程不安全,但是性能较高Hashtable
不允许使用null
作为key和value,而HashMap
中key和value都可以为null
-
key对象的比较:两个实现类判断key相等的标准是,两个key通过
equals()
方法比较返回true
,两个key的哈希值也相等。即只要两个key对象equals()
返回fasle
或者两个对象的哈希值不同,那么这两个对象就能同时保存在同一个HashMap
中(Hashtable
也一样)
所以在使用可变对象作为key时要十分谨慎,因为如果在存入Map后再修改key对象可能导致其哈希值的改变,从而
HashMap
无法准确访问到该key
LinkedHashMap实现类
- 使用双向链表维护了键值对的次序,则迭代顺序与键值对的插入顺序一致
- 迭代访问时性能较好
SortedMap接口和TreeMap实现类
- 基本可以参照
SortedSet
接口和TreeSet
实现类
WeakHashMap
WeakHashMap
与HashMap
基本相似,区别在与HashMap
对于key保存的是强引用,而WeakHashMap
对key保留的只是弱引用。这就意味着只要HashMap
对象不被销毁,其中所有的key所引用的对象也不会被垃圾回收;而在WeakHashMap
中的key所引用的对象如果没有被其他强引用变量所引用,就有可能被垃圾回收,WeakHashMap
也会自动删除对应的键值对。强弱引用可参考{% post_link jvm2-gc %}
IdentityHashMap实现类
IdentityHashMap
与HashMap
基本相似,区别在于只有当key1==key2
时,IdentityHashMap
才认为两个key是相等的。