搞懂JAVA集合類--HashTable, LinkedHashMap, TreeMap(四)

HashTable, LinkedHashMap, TreeMap相比HashMap不那麼常用。

HashTable和HashMap大體差不多,有幾點區別:
1. 我們從他們的定義就可以看出他們的不同,HashTable基於Dictionary類,而HashMap是基於AbstractMap。
2. HashMap可以允許存在一個爲null的key和任意個爲null的value,但是HashTable中的key和value都不允許爲null。
3. Hashtable的方法是同步的(對操作方法加同步鎖),而HashMap的方法不是
4. 哈希值的使用不同,HashTable直接使用對象的hashCode。而HashMap重新計算hash值。
5. Hashtable和HashMap它們兩個內部實現方式的數組的初始大小和擴容的方式。HashTable中hash數組默認大小是11,增加的方式是 old*2+1。HashMap中hash數組的默認大小是16,而且一定是2的指數。

LinkedHashMap是HashMap的一個子類,它保留插入的順序。保留順序的機制就是它維護着一個運行於所有條目的雙重鏈接列表,即Entry元素中有after和before兩個引用。此鏈接列表定義了迭代順序,該迭代順序可以是插入順序或者是訪問順序。

TreeMap則是另一種實現方式,底層基於紅黑樹實現
紅黑樹顧名思義就是節點是紅色或者黑色的平衡二叉樹,它通過顏色的約束來維持着二叉樹的平衡。對於一棵有效的紅黑樹二叉樹而言我們必須增加如下規則:
1、每個節點都只能是紅色或者黑色
2、根節點是黑色
3、每個葉節點(NIL節點,空節點)是黑色的。
4、如果一個結點是紅的,則它兩個子節點都是黑的。也就是說在一條路徑上不能出現相鄰的兩個紅色結點。
5、從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。
這些約束強制了紅黑樹的關鍵性質: 從根到葉子的最長的可能路徑不多於最短的可能路徑的兩倍長。結果是這棵樹大致上是平衡的。因爲操作比如插入、刪除和查找某個值的最壞情況時間都要求與樹的高度成比例,這個在高度上的理論上限允許紅黑樹在最壞情況下都是高效的,而不同於普通的二叉查找樹。所以紅黑樹它是複雜而高效的,其檢索效率O(log n)。下圖爲一顆典型的紅黑二叉樹。

這裏寫圖片描述
對於紅黑二叉樹而言它主要包括三大基本操作:左旋、右旋、着色。
這裏寫圖片描述這裏寫圖片描述

底層實現原理就是紅黑樹算法,比較複雜和難懂。TreeMap沒有調優選項,因爲該樹總處於平衡狀態。適用於按自然順序或自定義順序遍歷鍵(key),一般在需要按key排序時使用(注意LinkedHashMap是按插入順序排序,這個是Key的順序來排序)。Key需要支持Comparable接口或者在創建TreeMap時指定排序器

發佈了30 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章