HashMap 1.7 和 HashMap1.8 有比较大的区别,可以说1.8有很大的改进。而其中的默认初始化容量16,负载因子0.75,扩容2倍,基本没变。
-
扩容
1)1.7版本的时候,HashMap的数据结构是:数组 + 链表(Entry)
扩容条件: 同时满足,所有Entry加起来大于等于阈值(负载因子乘以初始化容量)和hash碰撞,二者缺一不可。
Hash 碰撞:通过 key 部分进行hash计算,得出的数组下标的值,如果原来这个数组下标位置原来已经有元素了(默认Entry是null),就会产生Hash碰撞。
过程:我们使用put()方法的时候,会调用addEntry()方法,然后进行判断是否需要扩容,如果需要就调用resize()方法创建一个2倍大的数组,并调用transfer()方法将原来这里面的Entry搬运过来。而搬过来时会对Entry进行rehash(重新计算hash值),得到新的数组下标。这时,相邻两个Entry有可能还是会进到同一个链表上,而插入的方法是头插法,如果原来的链表全都还在同个链表上,就会顺序变反了。
如果只满足:所有Entry加起来大于等于阈值,那么最大容量是16(一直没有发生hash碰撞),第17个才会扩容