JDK8 HashMap--treeify()樹形化方法


 1   /*創建紅黑樹*/
 2     final void treeify(Node<K,V>[] tab) {
 3             TreeNode<K,V> root = null;// 定義紅黑樹根節點root
 4             for (TreeNode<K,V> x = this, next; x != null; x = next) {// 循環,定義x:循環變量,代表當前節點、next:當前節點的后繼元
 5                 next = (TreeNode<K,V>)x.next;
 6                 x.left = x.right = null;// 初始化當前節點x的左子節點、右子節點
 7                 if (root == null) {// 若root為空,表明首次循環此時x指向的節點為根節點
 8                     x.parent = null;// 根節點無父節點
 9                     x.red = false;// 根節點為黑色
10                     root = x;
11                 }
12                 else {// 除首次循環外其余均走這個分支
13                     K k = x.key;// 獲取當前節點的key與hash值
14                     int h = x.hash;
15                     Class<?> kc = null;// 定義key的Class對象kc
16                     for (TreeNode<K,V> p = root;;) {// 循環,每次循環從根節點開始,尋找位置
17                         int dir, ph;// 定義節點相對位置、節點p的hash值
18                         K pk = p.key;// 獲取節點p的key
19                         if ((ph = p.hash) > h)
20                             dir = -1;// 當前節點在節點p的左子樹
21                         else if (ph < h)
22                             dir = 1;// 當前節點在節點p的右子樹
23                         else if ((kc == null &&
24                                   (kc = comparableClassFor(k)) == null) ||
25                                  (dir = compareComparables(kc, k, pk)) == 0)
26                             dir = tieBreakOrder(k, pk);// 當前節點與節點p的hash值相等,當前節點key並沒有實現Comparable接口或者實現Comparable接口並且與節點pcompareTo相等,該方法是為了保證在特殊情況下節點添加的一致性用於維持紅黑樹的平衡
27 
28                         TreeNode<K,V> xp = p;
29                         if ((p = (dir <= 0) ? p.left : p.right) == null) {// 根據dir判斷添加位置也是節點p的左右節點,是否為空,若不為null在p的子樹上進行下次循環
30                             x.parent = xp;// 若添加位置為null,建立當前節點x與父節點xp之間的聯系
31                             if (dir <= 0)// 確定當前節點時xp的左節點還是右節點
32                                 xp.left = x;
33                             else
34                                 xp.right = x;
35                             root = balanceInsertion(root, x);// 對紅黑是進行平衡操作並結束循環
36                             break;
37                         }
38                     }
39                 }
40             }
41             moveRootToFront(tab, root);// 將紅黑樹根節點復位至數組頭結點
42         }

 


免責聲明!

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



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