当我阅读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值,而另一个为空,就可以按原样重用它。

10-02 21:17