集合之TreeMap源码分析,简单介绍什么是红黑树,SortedMap和NavigableMap之间的关系和区别
TreeMap底層實(shí)現(xiàn)
1. TreeMap底層實(shí)現(xiàn)是紅黑樹,并且樹的節(jié)點(diǎn)是內(nèi)部類Entry類型
2. 紅黑樹的定義
① 每個(gè)節(jié)點(diǎn)是黑色或紅色;②根節(jié)點(diǎn)是黑色;③所有的葉節(jié)點(diǎn)是黑色,不是真正的葉節(jié)點(diǎn),而是每個(gè)葉節(jié)點(diǎn)為NIL的子節(jié)點(diǎn),不知道為什么要定義葉節(jié)點(diǎn)NIL,既然每個(gè)葉節(jié)點(diǎn)都可以有NIL的子節(jié)點(diǎn),有什么好說的呢???④紅節(jié)點(diǎn)的子節(jié)點(diǎn)不能是紅節(jié)點(diǎn);⑤從一個(gè)節(jié)點(diǎn)到葉子節(jié)點(diǎn)的所有路徑包含相同黑節(jié)點(diǎn)數(shù)。
其實(shí),我們只要記住三點(diǎn)即可。①紅黑樹的根節(jié)點(diǎn)是黑色;②紅節(jié)點(diǎn)的子節(jié)點(diǎn)不能是紅節(jié)點(diǎn);③一個(gè)節(jié)點(diǎn)到葉子節(jié)點(diǎn)的所有路徑包含相同的黑節(jié)點(diǎn)數(shù)。
?
3. TreeMap類繼承結(jié)構(gòu)圖
?
4. SortedMap接口顧名思義就是定義了一些關(guān)于排序有關(guān)的方法,這也是TreeMap和HashMap之間有區(qū)別的地方,方法說明如下圖。
?
5. NavigableMap顧名思義就是導(dǎo)航Map,也就是能迅速定位到某些key或Map,比如搜索比某個(gè)key大的key等,如下圖。
5.1 通過TreeMap中higherKey和CeilingKey的具體實(shí)現(xiàn)分析它們之間的區(qū)別,ceilingKey內(nèi)部調(diào)用了getCeilingEntry(),higherKey內(nèi)部則調(diào)用了getHigherEntry(),如下圖。
?
?
5.2 所以,higherKey是尋找大于當(dāng)前key的key,而ceiling尋找大于等于當(dāng)前key的key。
?
6. TreeMap對(duì)象的創(chuàng)建
6.1 默認(rèn)構(gòu)造函數(shù)——指定內(nèi)部比較器為null
6.2 指定比較器的構(gòu)造函數(shù)
6.3 傳入一個(gè)Map對(duì)象(如果是SortedMap實(shí)例,會(huì)調(diào)用SortedMap對(duì)象作為參數(shù)的構(gòu)造方法)的構(gòu)造函數(shù)——也指定比較器為null
6.4 傳入一個(gè)排序的SortedMap對(duì)象的構(gòu)造函數(shù)——得到比較器并賦值
6.5 總結(jié):對(duì)于TreeMap,要么指定比較器,要么傳入一個(gè)SortedMap對(duì)象,間接指定比較器,或者key自身實(shí)現(xiàn)comparable接口,比如String和Integer類。
?
7. put方法往TreeMap添加元素
?
8. get方法從TreeMap查詢、取出某元素——二叉樹搜索方式
?
9 remove方法刪除TreeMap中某個(gè)元素
?
10. TreeMap其它常用方法
10.1 containsKey——也是調(diào)用getEntry方法進(jìn)行二叉樹搜索
10.2 containsValue——二叉樹中序遍歷方式
10.3 clear方法清空TreeMap——直接把根節(jié)點(diǎn)置為null,不像LinkedList把每個(gè)節(jié)點(diǎn)的前后節(jié)點(diǎn)都斷開連接
10.4 TreeMap最有特性的一個(gè)方法——descendingMap
?
11 TreeSet——內(nèi)部是NavigableMap對(duì)象
11.1 有四種構(gòu)造方法,和TreeMap不太一樣
11.2 可以通過descendingSet得到降序的Set
總結(jié)
以上是生活随笔為你收集整理的集合之TreeMap源码分析,简单介绍什么是红黑树,SortedMap和NavigableMap之间的关系和区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详解集合之HashMap——HashMa
- 下一篇: 简单分析及总结BlockingQueue