HashMap扩容机制
扩容时机
当Map元素容量超过设定的阈值threshold=capacity * loadFactor时进行扩容,如下图所示:
JDK1.7扩容原理
原理:创建更大容量的新数组,重新计算每个元素在新数组中的位置进行迁移。
缺点:
- 每个元素需要重新计算hash;
- 链表中元素顺序每次迁移后被倒置;
JDK1.8扩容原理
原理:在扩充HashMap的时候,不需要像JDK1.7的实现那样重新计算hash,只需要看看原来的hash值新增的那个bit是1还是0就好了,是0的话索引没变,是1的话索引变成“原索引+oldCap”,可以看看下图为16扩充为32的resize示意图:
优点:
- 不需要像JDK1.7的实现那样重新计算hash;
- 链表中元素顺序保持不变;
参考:http://blog.****.net/aichuanwendang/article/details/53317351