Java Map体系

2016年07月21日

Collection集合框架体系

杂记

Dictionary接口

NOTE: This class is obsolete. New implementations should implement the Map interface, rather than extending this class.

这个类已经过时了,最新应该使用Map接口.(刚想吐嘈下,里面的方法全是abstract的,干嘛不声明为接口,然后就发现它已经被废弃了).

Hashtable

和Vector一样,在所有public方法上加上了synchronized关键字,使用较少.

扩容策略:当元素个数大于 散列表长度(table.lengh) * 负载系数(loadfactor,默认0.75)时, 新容量为 table.lengh*2+1 (即扩大两倍).

属性中有个叫modCount的属性.用来在返回的iterator判断循环获取元素时判断 是否发生过改变,如果改变了,则抛出ConcurrentModificationException异常.(iterator会持有在构建它时的modCount值).

Properties

继承自Hashtable,可从一个properties文件或者xml文件的输入流中读取 键值对.

IdentityHashMap

这个类和正常的HashMap差别是, IdentityHashMap在判断key或者value是否相等时,是使用引用来做等值比较的,即 key1 == key2. HashMap则是 k1==null ? k2==null : k1.equals(k2).

看说明里面说,这个类比较经典的一个使用是 在 拓扑结构图的转换时使用,比如在序列化和深度复制时,完成一次转换后需要保存到已处理的对象表,这个对象表就必须是严格相等的,而不能是逻辑等同的.还有一种使用场景是,在调试设备时可能需要为每个对象持有一个代理对象.

HashMap 和 LinedHashMap

HashMap在遍历时,元素是无序的,而LinkedHashMap在使用iterator遍历时,是有序的(插入顺序).

LinkedHashMap继承自HashMap,

  • 覆盖HashMapinit()方法,在init()方法中构建持有了一个链表的头节点.
  • 覆盖HashMapcreateEntry()方法,在createEntry()方法中,创建LinkedHashMap.Entity(比HashMap.Entitybeforeafter属性,用来保证顺序).并更新beforeafter属性
  • 调用HashMapremove()方法,方法中会调用Entity.recordRemoval()方法.即,会调用LinedHashMap.Entity.recordRemoval()方法,方法中会调用LinedHashMap.Entity.remove()方法,更新链表节点.

经过以上三步后, 在iterator遍历时,只需返回LinkedHashMap中链表的下一个元素,即可保证顺序.