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的數據結構其實是紅黑樹