当我阅读hashmap split方法的源代码时,发现了一段源代码:
final void split(HashMap<K,V> map, Node<K,V>[] tab, int index, int bit) {
TreeNode<K,V> b = this;
// Relink into lo and hi lists, preserving order
TreeNode<K,V> loHead = null, loTail = null;
TreeNode<K,V> hiHead = null, hiTail = null;
....
if (loHead != null) {
if (lc <= UNTREEIFY_THRESHOLD)
tab[index] = loHead.untreeify(map);
else {
tab[index] = loHead;
if (hiHead != null) // (else is already treeified)
loHead.treeify(tab);
}
}
.......
}
我不明白为什么使用loHead.treeify(tab);之前,如果需要(hiHead!= Null)判断。首先,我的理解是哈希映射在单个线程中使用,因此我无法想到hiHead和loHead之间的任何关系。官方评论是“其他已经树化了”。
最佳答案
该方法的输入是要拆分的树箱。如果该bin中的所有条目都属于一个或其他拆分集(即,对于新添加的哈希位,它们都具有相同的值),则输入树已经正确。只需将其根设为新bin值,而另一个为空,就可以按原样重用它。