final Node <K,
V> [] resize() {
Node <K,
V> [] oldTab = table;
int oldCap = (oldTab == null) ? 0 : oldTab.length; // 原数组如果为 null, 则长度赋值 0
int oldThr = threshold;
int newCap,
newThr = 0;
if (oldCap> 0) { // 如果原数组长度大于 0
if (oldCap>= MAXIMUM_CAPACITY) { // 数组大小如果已经大于等于最大值 (2^30)
threshold = Integer.MAX_VALUE; // 修改阈值为 int 的最大值 (2^31-1), 这样以后就不会扩容了
return oldTab;
}
// 原数组长度大于等于初始化长度 16, 并且原数组长度扩大 1 倍也小于 2^30 次方
else if ((newCap = oldCap <<1) < MAXIMUM_CAPACITY && oldCap>= DEFAULT_INITIAL_CAPACITY) newThr = oldThr <<1; // 阀值扩大 1 倍
} else if (oldThr> 0) // 旧阀值大于 0, 则将新容量直接等于就阀值
newCap = oldThr;
else { // 阀值等于 0,oldCap 也等于 0(集合未进行初始化)
newCap = DEFAULT_INITIAL_CAPACITY; // 数组长度初始化为 16
newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY); // 阀值等于 16*0.75=12
}
// 计算新的阀值上限
if (newThr == 0) {
float ft = (float) newCap * loadFactor;
newThr = (newCap <MAXIMUM_CAPACITY && ft < (float) MAXIMUM_CAPACITY ? (int) ft: Integer.MAX_VALUE);
}
threshold = newThr;@SuppressWarnings({
"rawtypes",
"unchecked"
}) Node < K,
V> [] newTab = (Node <K, V> []) new Node[newCap];
table = newTab;
if (oldTab != null) {
// 把每个 bucket 都移动到新的 buckets 中
for (int j = 0; j <oldCap; ++j) {
Node < K,
V> e;
if ((e = oldTab[j]) != null) {
oldTab[j] = null; // 元数据 j 位置置为 null, 便于垃圾回收
if (e.next == null) // 数组没有下一个引用 (不是链表)
newTab[e.hash & (newCap - 1)] = e;
else if (e instanceof TreeNode) // 红黑树
((TreeNode <K, V> ) e).split(this, newTab, j, oldCap);
else { // preserve order
Node <K,
V> loHead = null,
loTail = null;
Node <K,
V> hiHead = null,
hiTail = null;
Node <K,
V> next;
do {
next = e.next;
// 原索引
if ((e.hash & oldCap) == 0) {
if (loTail == null) loHead = e;
else loTail.next = e;
loTail = e;
}
// 原索引 + oldCap
else {
if (hiTail == null) hiHead = e;
else hiTail.next = e;
hiTail = e;
}
} while (( e = next ) != null);
// 原索引放到 bucket 里
if (loTail != null) {
loTail.next = null;
newTab[j] = loHead;
}
// 原索引 + oldCap 放到 bucket 里
if (hiTail != null) {
hiTail.next = null;
newTab[j + oldCap] = hiHead;
}
}
}
}
}
return newTab;
}
来源: https://www.cnblogs.com/ysocean/p/8711071.html