IdentityHashMap
IdentityHashMap不常被用到,我也是这次系统性看集合源码时才发先这个类,感觉这个类的实现比较有意思。
- 首先这个类底层没有使用自己特殊的数据结构(hashmap内部使用node,linkedhashmap使用entry等),IdentityHashMap底层直接使用Object数组实现,奇数下标存储键,偶数位下标存储值
- identityHashMap使用==来判断两个键是否相等,这个特性使得identityHashMap中的键可以重复
- identityHashMap使用System.identityHashCode进行存储位置查找,而HashMap使用Object中的HashCode实现
System.identityHashCode与Object.hashCode区别
- hashCode是Object类下的一个方法,子类可以继承、重写该方法,根据对象内存地址计算哈希值。比如String类重写了hashCode方法,并改为根据字符串序列计算哈希值
- identityHashCode方法是System类中的静态方法,根据对象内存地址计算哈希值
1 | public static void testHashCode() { |
类定义
该类继承了AbstractMap,实现了Map接口
1 |
|
重要的成员变量和类变量
1 | //默认初始大小,必须是2的幂次, |
构造函数
1 |
|
capacity
此函数返回最小的大于expectedMaxSize的2次幂
1 | private static int capacity(int expectedMaxSize) { |
hash
使用System.identityHasCode求哈希值
1 | //返回对应的下标index |
put
1 | public V put(K key, V value) { |
get
1 |
|
nextKeyIndex
向后探测逻辑比较简单,每次移动一个key-value的位置,即2个index
1 | private static int nextKeyIndex(int i, int len) { |
resize
1 |
|
remove
1 | public V remove(Object key) { |
closeDeletion
1 |
|