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也会自动删除对应的键值对。强弱引用可参考JVM笔记2:垃圾收集器
IdentityHashMap实现类
IdentityHashMap与HashMap基本相似,区别在于只有当key1==key2时,IdentityHashMap才认为两个key是相等的。