请配合源码食用本文
jdk版本:1.8
本文重点:
if (newThr == 0)的原理
进入正文:
四种扩容情况
(oldCap、oldThr、newCap、newThr 指:旧表长度、旧表阈值、新表长度、新表阈值)
-
旧表已初始化了 (oldCap>0)
-
旧表长度 >= 230 ,无法再扩容,将阈值threshold设为int最大值,直接返回
-
默认初始容量(24)<= 旧表长度 < 229 (右边不取等号,那229 怎么办?)
-
此时正常扩容:长度、阈值都翻倍(*2)
-
注意这里的实现:
if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY && oldCap >= DEFAULT_INITIAL_CAPACITY) newThr = oldThr << 1;
(newCap = oldCap << 1) 这种实现保证了无论条件是否成立,新表长度都等于旧表长度的两倍,但新阈值则符合条件才能翻倍
-
-
-
旧表未初始化,但旧阈值(oldThr)>0 。对应情况:new时指定了initialCapacity
- 操作: 新表长度 = 旧阈值 (newCap = oldThr)
-
其余情况,指未初始化,旧阈值也为0。最常见,因为对应情况:无参构造
/* 经典操作 */ newCap = DEFAULT_INITIAL_CAPACITY; // 16 newThr