jdk原始碼分析之TreeMap
1.TreeMap簡介
TreeMap是通過紅黑樹來實現一個有序的key-value集合的。
TreeMap是基於紅黑樹實現的,該對映可以根據他的鍵的自然順序進行排序,也可以根據為建構函式提供的比較器進行排序。
TreeMap的基本操作containsKey,get,put,remove的時間複雜度是log(n),另外TreeMap是非同步的。
2.TreeMap資料結構
TreeMap的繼承關係
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable {}
1.由繼承關係可知,TreeMap繼承與AbstractMap,並且實現了Navigable介面。
2.TreeMap的本質是紅黑樹,它包含幾個重要的成員變數,root,size,comparator。其中root是紅黑樹的節點,他的型別是Entry,它包含key,value,left(左孩子),right(右孩子),parent(父節點),color(顏色)。Entry節點根據key進行排序;可以是自然排序,也可以根據比較器來進行排序;size是紅黑樹節點中的個數。
3.TreeMap原始碼分析
3.1紅黑樹相關
//紅黑樹的節點顏色--紅色
private static final boolean RED = false;
//紅黑樹的節點顏色--黑色
private static final boolean BLACK = true;
//紅黑樹左旋
private void rotateLeft(Entry<K,V> p) { ... }
//紅黑樹右旋
private void rotateRight(Entry<K,V> p) { ... }
//紅黑樹插入操作
public V put(K key, V value) { ... }
//紅黑樹插入修正操作,保證在進行插入之後,任然是一顆紅黑樹
private void fixAfterInsertion(Entry<K,V> x) { ... }
//紅黑色的刪除操作
private void deleteEntry(Entry<K,V> p) { ... }
//紅黑樹刪除修正操作,保證在進行刪除之後,任然是一顆紅黑樹
private void fixAfterDeletion(Entry<K,V> x) { ... }
3.2TreeMap的建構函式
1.預設建構函式
public TreeMap() {
comparator = null;
}
2.帶比較器的建構函式
public TreeMap(Comparator<? super K> comparator) {
this.comparator = comparator;
}
3.有Map的建構函式
public TreeMap(Map<? extends K, ? extends V> m) {
comparator = null;
putAll(m);
}
其中putAll()會把m中的所有元素新增到TreeMap中,其中putAll的原始碼如下:
public void putAll(Map<? extends K, ? extends V> m) {
for (Map.Entry<? extends K, ? extends V> e : m.entrySet())
put(e.getKey(), e.getValue());
}
3.3TreeMap中與Entry相關的函式
與Entry相關的函式
//以下與Entry相關的函式原理大同小異
firstEntry()
lastEntry()
lowerEntry()
higherEntry()
floorEntry()
ceilingEntry()
pollFirstEntry()
pollLastEntry()
再次以firstEntry()為例子進行說明:
public Map.Entry<K,V> firstEntry() {
return exportEntry(getFirstEntry());
}
final Entry<K,V> getFirstEntry() {
Entry<K,V> p = root;
if (p != null)
while (p.left != null)
p = p.left;
return p;
}
firstEntry()和getFirstEntry()都是用於獲取第一個節點。firstEntry()是對外介面,getFirstEntry()是對內介面。為什麼外界不直接呼叫getFirstEntry()來實現,而是通過呼叫firstEntry()來獲取第一個Entry呢?這樣做的目的是為了防止使用者修改返回的Entry.
3.4TreeMap中與Key相關的函式
//以下與key有關的函式原理類似
firstKey()
lastKey()
lowerKey()
higherKey()
floorKey()
ceilingKey()
//該函式返回大於/等於key的最小的鍵值對所對應的key,沒有的話就返回null
public K ceilingKey(K key) {
return keyOrNull(getCeilingEntry(key));
}
static <K,V> K keyOrNull(TreeMap.Entry<K,V> e) {
return e == null? null : e.key;
}
相關文章
- 【集合框架】JDK1.8原始碼分析之TreeMap(五)框架JDK原始碼
- JDK1.8 原始碼分析(十) -- TreeMapJDK原始碼
- Java原始碼閱讀之TreeMap(紅黑樹) - JDK1.8Java原始碼JDK
- jdk原始碼分析之PriorityQueueJDK原始碼
- jdk原始碼分析之WeakHashMapJDK原始碼HashMap
- jdk原始碼分析之ArrayListJDK原始碼
- jdk原始碼分析之HashMapJDK原始碼HashMap
- jdk原始碼分析之CopyOnWriteArrayListJDK原始碼
- 原始碼|jdk原始碼之HashMap分析(一)原始碼JDKHashMap
- 原始碼|jdk原始碼之HashMap分析(二)原始碼JDKHashMap
- jdk原始碼分析之LinkedListJDK原始碼
- jdk原始碼分析之ConcurrentHashMapJDK原始碼HashMap
- jdk原始碼分析之LinkedHashMapJDK原始碼HashMap
- 死磕 jdk原始碼之HashMap原始碼分析JDK原始碼HashMap
- Java集合原始碼分析(十四):TreeMapJava原始碼
- java基礎:TreeMap — 原始碼分析Java原始碼
- JDK1.8原始碼(十一)——java.util.TreeMap類JDK原始碼Java
- JDK1.8原始碼分析之HashMapJDK原始碼HashMap
- jdk1.8原始碼之HashMap分析JDK原始碼HashMap
- TreeMap原始碼分析,看了都說好原始碼
- 原始碼|jdk原始碼之棧、佇列及ArrayDeque分析原始碼JDK佇列
- 死磕 java集合之TreeMap原始碼分析(四)-內含彩蛋Java原始碼
- 【JDK】JDK原始碼分析-AbstractQueuedSynchronizer(1)JDK原始碼
- 【JDK】JDK原始碼分析-AbstractQueuedSynchronizer(2)JDK原始碼
- 【JDK】JDK原始碼分析-AbstractQueuedSynchronizer(3)JDK原始碼
- 【JDK】JDK原始碼分析-ReentrantLockJDK原始碼ReentrantLock
- TreeMap原始碼剖析原始碼
- 【JDK原始碼分析系列】ArrayBlockingQueue原始碼分析JDK原始碼BloC
- 【JUC】JDK1.8原始碼分析之CyclicBarrier(四)JDK原始碼
- 【JUC】JDK1.8原始碼分析之CountDownLatch(五)JDK原始碼CountDownLatch
- 【JUC】JDK1.8原始碼分析之AbstractQueuedSynchronizer(二)JDK原始碼
- 【JUC】JDK1.8原始碼分析之Semaphore(六)JDK原始碼
- 【JUC】JDK1.8原始碼分析之LockSupport(一)JDK原始碼
- 死磕 java集合之TreeMap原始碼分析(二)——紅黑樹全解析Java原始碼
- 死磕 java集合之TreeMap原始碼分析(三)——紅黑樹全解析Java原始碼
- 死磕 java集合之TreeMap原始碼分析(一)——紅黑樹全解析Java原始碼
- 死磕 java集合之TreeMap原始碼分析(四)——紅黑樹全解析Java原始碼
- Java TreeMap 原始碼解析Java原始碼