protected void rehash() {
int oldCapacity = table.length;
Entry<?,?>[] oldMap = table;
// overflow-conscious code
int newCapacity = (oldCapacity << 1) + 1;//扩容策略:原容量扩大两倍+1
if (newCapacity - MAX_ARRAY_SIZE > 0) { //新容量大于最大容量
if (oldCapacity == MAX_ARRAY_SIZE)//如果原容量等于最大容量直接返回
// Keep running with MAX_ARRAY_SIZE buckets
return;
newCapacity = MAX_ARRAY_SIZE;//否则把最大容量赋值给新容量
}
Entry<?,?>[] newMap = new Entry<?,?>[newCapacity];
modCount++;
threshold = (int)Math.min(newCapacity * loadFactor, MAX_ARRAY_SIZE + 1);//当原容量等于最大容量时,返回后一个值,否则返回前一个值
table = newMap;
for (int i = oldCapacity ; i-- > 0 ;) {//遍历数组
for (Entry<K,V> old = (Entry<K,V>)oldMap[i] ; old != null ; ) {//遍历链表
Entry<K,V> e = old;
old = old.next;
int index = (e.hash & 0x7FFFFFFF) % newCapacity;//计算节点保存的位置
e.next = (Entry<K,V>)newMap[index];//把newMap[index]上的节点挂在e节点后面
newMap[index] = e;//newMap[index]指向e节点
//其实就是往头部插入节点
by IT_Datouer
/**
* @author by IT_datouer
*/
}
}
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交