共同学习Java源代码-数据结构-HashMap(十六)

来源:互联网 发布:狸窝mp4视频转换器mac 编辑:程序博客网 时间:2024/06/05 10:54
        final TreeNode<K,V> find(int h, Object k, Class<?> kc) {
            TreeNode<K,V> p = this;
            do {
                int ph, dir; K pk;
                TreeNode<K,V> pl = p.left, pr = p.right, q;
                if ((ph = p.hash) > h)
                    p = pl;
                else if (ph < h)
                    p = pr;
                else if ((pk = p.key) == k || (k != null && k.equals(pk)))
                    return p;
                else if (pl == null)
                    p = pr;
                else if (pr == null)
                    p = pl;
                else if ((kc != null ||
                          (kc = comparableClassFor(k)) != null) &&
                         (dir = compareComparables(kc, k, pk)) != 0)
                    p = (dir < 0) ? pl : pr;
                else if ((q = pr.find(h, k, kc)) != null)
                    return q;
                else
                    p = pl;
            } while (p != null);
            return null;

        }

这个是查找制定树节点的方法 

创建p变量 引用本节点对象 

进入do while循环 循环条件是p不为空 

然后创建int类型临时变量ph dir 键类型pk

再创建书节点类型pl 赋引用为p的左节点 pr对象赋引用为p的右节点 再创建一个树节点变量q

将本节点 也就是p所引用的节点的哈希值赋给ph 判断如果ph大于参数h 也就是说参数的节点的哈希值小于本节点的哈希值 说明参数节点肯定位于本节点左侧 否则是右侧

如果参数节点不在本节点的左侧以及右侧 且p的键和参数键为同一对象或相一致 就说明本节点就是要找的节点 返回本节点即可

如果参数节点不是本节点 且左侧节点为空 就将p赋引用为右侧节点 如果右侧节点为空 就将p赋引用为左侧节点

如果传入的参数kc是Comparable的实现类 且参数键和本节点的键对比结果不为0 再判断如果对比结果小于0 说明参数键在本节点左侧 否则就是右侧 将p赋为左节点或右节点

如果右节点递归调用发现返回值不为空 就将右节点递归调用的结果返回 

如果上述条件都不成立 就将p设置为左节点 

以上这么多 就是来回来去判断到底是本节点 左节点 还是右节点


        final TreeNode<K,V> getTreeNode(int h, Object k) {
            return ((parent != null) ? root() : this).find(h, k, null);
        }

这个方法是自上到下查找节点的方法 先判断本节点是否为根节点 如果不是就调用root方法返回根节点 自上到下去查参数k对应的节点


阅读全文
0 0
原创粉丝点击