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
,
- 覆盖
HashMap
的init()
方法,在init()
方法中构建持有了一个链表的头节点. - 覆盖
HashMap
的createEntry()
方法,在createEntry()
方法中,创建LinkedHashMap.Entity
(比HashMap.Entity
多before
和after
属性,用来保证顺序).并更新before
和after
属性 - 调用
HashMap
的remove()
方法,方法中会调用Entity.recordRemoval()
方法.即,会调用LinedHashMap.Entity.recordRemoval()
方法,方法中会调用LinedHashMap.Entity.remove()
方法,更新链表节点.
经过以上三步后, 在iterator
遍历时,只需返回LinkedHashMap
中链表的下一个元素,即可保证顺序.