Collection源碼分析(六):TreeMap源碼分析

TreeMap繼承 AbstractMap並實現了NavigableMap<K,V>, Cloneable, java.io.Serializable 接口java

TreeMap的主要參數以下數據結構

一個comparator比較器,一個名字叫root的節點,size:Map元素個數 modCount 構造樹的次數指針

能夠先看一下Entry的結構排序

除了key value以外 還有一個left變量 right變量 和一個parent變量 這個結構和Map的Entry不太同樣 繼承

還有一個color屬性此處後面再說接口

能夠將treemap的節點想象成以下的結構內存

PS:是否是和二叉樹裏面的節點感受很像io

TreeMap的構造器以下變量

只是將比較器賦值爲null二叉樹

首先咱們來看看treeMap是怎麼構建結構的先看put方法

在上述的代碼中

1.當咱們put進第一個元素的時候 此時root元素是Null 走的是第一個if  而後主要工做就是 新建了一個節點 而且將這個節點給到root 注意他的parent節點是空

2.再次放入元素的時候將會進入第二個IF判斷 顯然易見 咱們將會直接走到else裏面

第二個IF是作什麼用的 是給咱們自定義排序使用 當你實例化TreeMap的時候 他有一個帶Comparator 的構造器

TreeMap(Comparator<? super K> comparator)

在咱們不從新定義比較器的時候 會使用else裏的默認比較器 本章以默認爲主

比較放入元素的Key與根節點的Key的大小 這裏的compareTo方法來自Comparable這個接口

A>B 返回 1 ;A=B 返回 0 ;A<B 返回-1

這裏完成的操做就是定位 更具你的元素的KEY值大小 從ROOT節點開始比較 小的話取節點的左側 大的話取節點的右側 相等的話 直接賦值  直到定位到葉子節點(是否是很像二叉排序樹

找到節點的位置以後

3.新建一個節點 將這個新節點的parent指向 找到的節點 而且把 父節點左右指針更具KEY值比較的結果指向這個新建的節點 能夠看到 key值小的 在父節點左 大的 在父節點右

因此咱們能夠看到 treeMap的結構就是一個二叉排序樹的內存結構 在內存中是採用鏈表的形式去創建上下的關係

注意到 Entry裏面還有一個COLOR值  能夠看到fixAfterInsertion(Entry)方法

這裏就是給TreeMap的元素上色的過程  而且rotateRight以及rotateleft分別是右旋左旋操做 是平衡樹的操做

總結 TreeMap的數據結構其實是紅黑樹

相關文章
相關標籤/搜索