JDK8 HashMap--getTreeNode()獲取紅黑樹指定key的節點


 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         }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM