HashMap原始碼一覽(中)
今天我們接著上面繼續分析HashMap的原始碼,JDK8中我們引入了紅黑樹,這一章節,我們主要來探討下紅黑樹。 在引入紅黑樹之前,我們先了解下二叉查詢樹(Binary Search Tree BST)。
1. 二叉查詢樹
BST具備的特性:
(1)左側樹值小於等於它的根節點值。
(2)右側樹大於等於它的根節點值。
(3)左右側數都是二叉查詢樹。
BST具備的優點:
(1)通過上面的特徵描述,相比線型儲存,它優化了查詢的效能,比如說:下面就是一個典型的二叉樹查詢,如果我們要查詢數值為10的節點,只需要3步,9->13->11->10。
BST具備的缺陷:
1.糟糕情況下會變成線型結構,這樣會大大降低效能。(這種情況比如說:插入節點總是小於根節點或者大於根節點),如下圖所示:
2. 二叉查詢樹
基於二叉查詢樹存在這種缺陷,紅黑樹的出現就是解決這種問題,它是二叉查詢樹的典型,又叫做平衡二叉查詢樹,接下來具體講講紅黑樹的一些特徵。
紅黑樹的特徵:
(1)根節點是黑色
(2)顧名思義,節點的顏色分為紅色或者黑色
(3)空節點為黑色
(4)每個紅色節點的子節點都是黑色節點(不能有兩個連續的紅色節點)
(5)從任意節點到每個葉子的所有路徑黑色節點個數相同
由於紅黑樹具有上面這些特徵的約束,我們在對紅黑樹進行插入,刪除操作時可能會破壞原有紅黑樹的樹結構,這個時候需要對數結構重新作出調整,紅黑數調整的方式有有兩種:變色和旋轉(左旋轉、右旋轉)。
- 左旋轉
對於當前結點而言,如果右子結點為紅色,左子結點為黑色,則執行左旋轉,如下圖:
- 右旋轉
對於當前結點而言,如果左子、左孫子結點均為紅色,則執行右旋轉,如下圖:
- 變色
對於當前結點而言,如果左、右子結點均為紅色,則執行變色,如下圖: