话不多说直接上代码,全在代码里面,只不过不涉及红黑树,红黑树放在下一部分写
final HashMap.Node<K,V>[] resize() {
//新建一个Node,指向旧table
HashMap.Node<K,V>[] oldTab = table;
//oldCap暂且叫它旧容量吧,如果oldTab是null,那么直赋0,否则就是之前的容量-->也就是table的长度
int oldCap = (oldTab == null) ? 0 : oldTab.length;
//oldThr 指的是旧的容量阈值,也就是oldCap * loadFactor
int oldThr = threshold;
//定义新容量,新的阈值参数,之后的一部分就专门是给这两个参数赋值
int newCap, newThr = 0;
//如果旧容量大于0,说明之前Hashmap装过数据,至于现在有没有要判断
if (oldCap > 0) {
//如果旧容量不小于Hashmap规定的最大容量,那么就把阈值调为Integer的最大值,之后就不管了,让数据去碰撞吧
if (oldCap >= MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return oldTab;
}
//让oldCap左移一位,并赋值给newCap,如果newCap小于最大容量,并且oldCap不小于默认初始化容量
//那么就让阈值翻倍,也就是将来存储数据量能够翻倍
else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&