Java笔记4:Map接口

Map接口

    Map用于保存键值对(key-value),其中key不允许重复。Map接口的继承树如下:
map
可以看到,Map的子类层次与Set很像,Set接口下有HashSetLinkedHashSetSorterdSetTreeSetEnumSet;相应的,Map接口下有HashMapLinkedHashMapSortedMapTreeMapEnumMapMap的这些实现类中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

    WeakHashMapHashMap基本相似,区别在与HashMap对于key保存的是强引用,而WeakHashMap对key保留的只是弱引用。这就意味着只要HashMap对象不被销毁,其中所有的key所引用的对象也不会被垃圾回收;而在WeakHashMap中的key所引用的对象如果没有被其他强引用变量所引用,就有可能被垃圾回收,WeakHashMap也会自动删除对应的键值对。强弱引用可参考{% post_link jvm2-gc %}

IdentityHashMap实现类

    IdentityHashMapHashMap基本相似,区别在于只有当key1==key2时,IdentityHashMap才认为两个key是相等的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章