之前读这段代码一直搞不懂transfer()是如何将原table中的节点插入新的table。最近想明白了,觉得有必要记录下来。如有理解不对的地方,欢迎给出建议。
void transfer(Entry[] newTable, boolean rehash) {
//新table的容量
int newCapacity = newTable.length;
//遍历原table
for (Entry<K,V> e : table) {
while(null != e) {
//保存下一次循环的 Entry<K,V>
Entry<K,V> next = e.next;
if (rehash) {
//通过e的key值计算e的hash值
e.hash = null == e.key ? 0 : hash(e.key);
}
//得到e在新table中的插入位置
int i = indexFor(e.hash, newCapacity);
//采用链头插入法将e插入i位置,最后得到的链表相对于原table正好是头尾相反的
e.next = newTable[i];
newTable[i] = e;
//下一次循环
e = next;
}
}
}
网友评论