主要在HashMap扩容时,在transfer中,将原table中的列表逆序放到新table中。
// newTable即为新容器,rehash为是否需要重新计算hash值,无需关注
void transfer(Entry[] newTable, boolean rehash) {
int newCapacity = newTable.length; // 新容量
for (Entry<K,V> e : table) { // 遍历所有节点
while(null != e) { // 当前元素不为空
Entry<K,V> next = e.next; // 记录next
if (rehash) { // 必要时重新计算hash
e.hash = null == e.key ? 0 : hash(e.key);
}
int i = indexFor(e.hash, newCapacity); // 算出新的下标
e.next = newTable[i]; // 注意!!! 将新容器的i处节点赋值到当前元素的next上
newTable[i] = e; // 当前元素成为新的头节点
e = next; // 继续下一个节点
}
}
}
在并发场景下,会产生A->B->A环导致死循环,造成死锁