HashMap扩容以及ConcurrentHashMap扩容机制
HashMap
1.7
void transfer(Entry[] newTable) {
// 1.7 的hashmap 数组+链表
// 获取到旧表
Entry[] src = table;
// 获取到新表的长度(数组的长度)
int newCapacity = newTable.length;
// 遍历旧表的每一条链表
for (int j = 0; j < src.length; j++) { //遍历旧的Entry数组
Entry<K, V> e = src[j]; //取得旧Entry数组的每个元素
if (e != null) {
// 释放掉旧的Entry数组的对象引用
src[j] = null;
// 遍历链表中的元素进行转移到新表中(头插法转移元素)
do {
Entry<K, V> next = e.next;
// 重新计算每个元素在数组中的位置!!
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
} while (e != null);
}
}
}