HashMap
HashMap1.7
HashMap1.7以数组加链表的形式存储元素,先根据key模除计算出hash值,放在对应数组下标的位置,如果发生hash冲突,以链表的形式存储。
HashMap1.8
HashMap1.8以数组加链表加红黑树的形式存储元素,对key做与运算计算出hash值,放在对应数组下标的位置,如果链表的长度大于8,先判断HashMap大小是否大于64,小于64优先扩容,大于64链表转红黑树。
HashMap1.7扩容
HashMap1.7使用头插法,并发扩容可能会死锁。两个线程同时扩容,每个线程都有一组指针指向要转移的元素,线程1转移元素后,元素的上下位置调换。线程2指针还是指向原来的元素,但是位置已经变了,下面的元素本身指向上面的元素,现在上面的元素指向下面的元素,就形成环死锁。
HashMap1.8扩容
hashmap1.8扩容优化,元素迁移不需要rehash,使用两组指针区分高低位(&老数组长度)结果为0或非0,结果0转移到新数组的原位置,结果非0转移到原数组位置+老数组大小的位置
负载因子0.75
负载因子0.75(数组一半以上位置有值),在空间和性能上做平衡,根据牛顿二项式得出结果0.7
为什么是2的次幂
1.8作hash运算使用&length-1,因为2的幂-1都是11111结尾的,和模除结果是一样的,碰撞几率小。使Hash算法的结果均匀分布。
CurrentHashMap
使用了分段锁,细化锁力度,提升性能。
当一个线程对CurrentHashMap扩容时,如果是正在扩容中,会帮助完成CurrentHashMap的扩容。