|
|
简介
IdentityHashMap
在平时并不常用,通过例子来简单感受下。
IdentityHashMap
和HashMap
没有任何关系,它俩使用的数据结构完全不同。
|
|
运行结果如下:
说明:IdentityHashMap只有在key是同一个引用时才会覆盖,而HashMap则不会。
IdentityHashMap
using reference-equality in place of object-equality when comparing keys (and values)
- reference-equality:
k1 == k2
- object-equality:
k1==null ? k2==null : k1.equals(k2)
IdentityHashMap
的key和value都可以为null- 无序的
- 非线程安全的
数据结构
IdentityHashMap
的数据结构很简单,底层就是一个Object数组,在逻辑上可以看成是一个环形的数组, 没有节点类型,数组的偶数位存放key,奇数位存放value。
容量为16的哈希表实际申请数组大小为32,当元素的个数(11)大于数组大小(32)的三分之一时扩容。
解决冲突的办法是开放定址法:也就是根据计算得到散列的位置索引,如果发现该位置上已有元素,则往后查找,直到找到空位置。当元素个数达到一定阈值时,Object数组会进行扩容。
源码分析
属性
|
|
构造函数
|
|
方法
capacity
此函数返回的是最小的且大于expectedMaxSize的2次幂数
hash
由于length总是2的幂次方,所以& (length - 1)
相当于取模运算。
这个hash方法得到的值始终都是偶数,以保证key始终会存放在偶数位置,而不会插入到value的位置上,value都是放在奇数位置上的。
get
|
|
nextKeyIndex
下一个Key的索引,用于发生冲突时,取下一个位置进行判断。
nextKeyIndex始终加2,如果key在当前位置已经存在值,那么继续寻找下一个位置,这个时候就会在此位置的基础上加2,如果加1就会和value冲突了。
put
|
|
resize
|
|
remove
|
|
感谢:
http://www.cnblogs.com/leesf456/p/5253094.html
http://www.itdadao.com/articles/c15a645336p0.html