HashMap通过resize()方法进行扩容。
源码解析:
resize()函数有两种使用情况:
一、当table数组为null时初始化hash表。
二、当table数组不为null时进行扩容。
1、如果table数组的容量超过最大容量时,无法扩容,直接返回旧的数组。并将threshold值设置为Integer.MAX_VALUE(2^31-1),
2、如果table数组的容量扩展为原来的2倍时仍没有超过最大容量且table数组原来的长度已经大于默认的初始容量时,将threshold扩大为原来的2倍。
3、将旧数组中的节点转移到新的数组中去
1)、如果旧数组中的头节点不为null且头节点没有下一个节点,则先将旧数组置空,再计算该节点在新数组的索引,最后将该节点放到新数组的该索引位置处
2)、如果旧数组中的头节点为树节点,则按树节点的方式处理。
3)、如果旧数组中的头节点有下一个节点,则将下一个节点赋值给next,经过观测可以发现,我们使用的是2次幂的扩展(指长度扩为原来2倍),所以,元素的位置要么是在原位置,要么是在原位置再移动2次幂的位置。当将该头节点放到新数组时的索引位置等于其在旧数组的索引位置,如果尾节点为null,则将e赋值给头节点,,并将e赋值给尾节点.;如果尾节点不为null,则将e赋值给尾节点的下一个节点,并将e赋值给尾节点。如果尾节点不为null,则将尾节点的next属性置为null,再将头节点赋值给新数组的索引位置。
当将该头节点放到新数组时的索引位置等于其在旧数组的索引位置再加上旧数组的长度,如果尾节点为null,则将e赋值给头节点,,并将e赋值给尾节点.;如果尾节点不为null,则将e赋值给尾节点的下一个节点,并将e赋值给尾节点。如果尾节点不为null,则将尾节点的next属性置为null,再将头节点赋值给新数组的索引位置(就数组的索引位置+旧数组的长度)。