JDK8 HashMap--getTreeNode()获取红黑树指定key的节点

本文详细解析了红黑树中查找指定节点的算法流程,包括从根节点开始的递归搜索过程,以及如何通过比较节点key和目标key来确定搜索方向。特别介绍了当目标key与当前节点key相等但hash值相同的情况下的特殊处理方式。
 1 /*获取红黑树的指定节点*/
 2         final TreeNode<K,V> getTreeNode(int h, Object k) {
 3             return ((parent != null) ? root() : this).find(h, k, null);// 从根节点开始查询
 4         }
 5         
 6         /*获取红黑树指定节点*/
 7         final TreeNode<K,V> find(int h, Object k, Class<?> kc) {
 8             TreeNode<K,V> p = this;// 见213行,此节点p就是根节点,进入循环后p代表当前节点
 9             do {
10                 int ph, dir; K pk;// 定义当前节点p的hash值ph、相对位置dir、key
11                 TreeNode<K,V> pl = p.left, pr = p.right, q// 获取当前节点的左子节点、右子节点
12                 if ((ph = p.hash) > h)// 表明目标节点在当前节点的左子节点
13                     p = pl;
14                 else if (ph < h)// 表明目标节点在当前节点的右子节点
15                     p = pr;
16                 else if ((pk = p.key) == k || (k != null && k.equals(pk)))// 当前节点的hash值与目标节点hash值相等,且当前节点的key与目标key相等(equals)
17                     return p;
18                 else if (pl == null)// 当前节点的hash值与目标节点hash值相等,且当前节点的key与目标key不相等(equals)
19                     p = pr;
20                 else if (pr == null)
21                     p = pl;
22                 else if ((kc != null ||
23                           (kc = comparableClassFor(k)) != null) &&
24                          (dir = compareComparables(kc, k, pk)) != 0)// 当前节点的hash值与目标节点hash值相等,且当前节点的key与目标key不相等(equals),且左子节点与右子节点均不为null,目标key实现Comparable接口,且与当前节点比较不为0
25                     p = (dir < 0) ? pl : pr;
26                 else if ((q = pr.find(h, k, kc)) != null)// 当前节点的hash值与目标节点hash值相等,且当前节点的key与目标key不相等(equals),且左子节点与右子节点均不为null,目标key没有实现Comparable接口,则直接在右子树中查询,这个方法并没有在左子树中循环,因为这是一个递归方法,先遍历右子树并判断是否查找到,若无则将左子树根节点作为当前节点,不用遍历左子树依然可以覆盖全部情况
27                     return q;
28                 else
29                     p = pl;
30             } while (p != null);
31             return null;// 未找到,返回null
32         }

转载于:https://www.cnblogs.com/flydoging/p/10385829.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值