final Node<K,V>[] resize() {
Node<K,V>[] oldTab = table;
int oldCap = (oldTab == null) ? 0 : oldTab.length;
int oldThr = threshold;
int newCap, newThr = 0;
// 只有非第一次扩容才会进来(第一次扩容在第一次put)
if (oldCap > 0) {
// oldCap最大为MAXIMUM_CAPACITY(2^30),可查看带参构造方法①
if (oldCap >= MAXIMUM_CAPACITY) {
/**
* threshold变成MAX_VALUE(2^31-1),随它们碰撞。但是oldCap不改变,
* 因为如果oldCap翻倍就为负数了,如果赋值为MAX_VALUE,
* 参考 Map容量为什么不能为MAX_VALUE②
*/
threshold = Integer.MAX_VALUE;
return oldTab;
}
// 容量翻倍
else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
oldCap >= DEFAULT_INITIAL_CAPACITY)
/**
* 为什么需要判断oldCap >= DEFAULT_INITIAL_CAPACITY呢?
* 应该是容量较小时 capacity * loadFactor造成的误差比较大,
* 例如初始化容量为2 threshold则为1,如果每次扩容threshold都翻倍,
Java1.8 对HashMap的resize()的理解
最新推荐文章于 2024-06-05 09:04:45 发布