HashMap底层扩容2倍原理
总所周知,获取分配的两种计算公式:
内存中获取分区位置:hash(key.hashCode) % (length - 1)
HashMap获取数据存储的位置:hash(key.hashCode) & (length - 1)
为何HashMap底层扩容机制是两倍?
那么先来看一下,不是扩容两倍的情况
通过key的HashCode值在进行hash散列算法后得到均匀的二进制
此时假设数组的长度为5
根据数据存储的位置计算出索引(0,1,2,3,4,)
//hash(key.hashCode) 0101 0101(因无法确认key的值,这里取随机数)
// &
//(length - 1) 0000 0100
------------------------------------------------------
// 0000 0100 => 分区索引选择结果只有4,0 两种情况
解析:
无论hashcode的值是多少,只有可能取到4和0两个值,因为length-1是固定值,这种情况下,1,2,3都无法取到,总共有五个索引,但只能取到其中两个,这就造成数据倾斜,大量的数据形成链表,浪费内存空间