HashTable、HashMap、LinkedHashMap、TreeMap之間的區別
一:HashTable與HashMap之間的區別
HashTable | HashMap | |
內部儲存元素 | 無序 | |
底層實現 | 陣列+連結串列 | 陣列+連結串列 |
實現原理 | ||
效率 | 低 | 高 |
null | 不接受null key、null value | 可接受null key、null value |
執行緒同步 | 同步[synchronized實現] | 不同步 |
執行緒安全 | synchronized[執行緒安全] | 非synchronized[執行緒不安全] |
擴容方式 | old * 2 + 1 | old * 2 |
預設容量 | 11 | 16 |
父類 | Dictionary | AbstractMap |
方法 | contains() | containsKey()、contaionsValue() |
延伸:
HashMap的底層實現:
有文章提到:HashMap的實現原理為:基於拉鍊法的散列表,也有文章說是:散列表。到底是什麼呢?
雜湊表[hash table]也叫散列表,雜湊表的主幹就是陣列。
資料結構的物理儲存結構只有兩種:順序儲存結構和鏈式儲存結構(像棧,佇列,樹,圖等是從邏輯結構去抽象的,對映到記憶體中,也這兩種物理組織形式)。
HashMap的主幹是一個Entry陣列。Entry是HashMap的基本組成單元,每一個Entry包含一個key-value鍵值對。
相同點:
同時實現了map、Cloneable(可複製)、Serializable(可序列化)這三個介面
HashMap同步的方式
Map m = Collections.synchronizeMap(hashMap);
HashTable已經被淘汰了,不要在程式碼中再使用它。
以下描述來自於HashTable的類註釋:
If a thread-safe implementation is not needed, it is recommended to use HashMap in place of Hashtable. If a thread-safe highly-concurrent implementation is desired, then it is recommended to use java.util.concurrent.ConcurrentHashMap in place of Hashtable.
簡單來說就是,如果你不需要執行緒安全,那麼使用HashMap,如果需要執行緒安全,那麼使用ConcurrentHashMap。HashTable已經被淘汰了,不要在新的程式碼中再使用它。
ConcurrentHashMap實現原理:支援併發讀寫的HashMap,特點:讀取資料時無需加鎖,寫資料時可以保證加鎖粒度儘可能的小。內部採用“分段儲存”。
二:HashMap、LinkedHashMap、TreeMap之間的區別
HashMap | LinkedHashMap | TreeMap | |
迭代順序 | 隨著時間的推移,不保證順序將維持不變 | 插入順序 | 根據自然順序排序 |
Get/put remove containsKey 時間複雜度 |
O(1) | O(1) | O(log(n)) |
介面類 | Map | Map | NavigableMap Map SortedMap |
Null Values/Key |
允許 | 允許 | 僅values |
底層實現 | buckets | 雙向連結串列+buckets | 紅黑樹 |
執行緒安全 | 不安全 | ||
能夠記住元素插入的順序 |
HashMap 是基於散列表,並且用拉鍊法來解決雜湊衝突的。所以 HashMap 的底層資料結構是 “陣列 + 連結串列”,即元素是連結串列的陣列。不過當連結串列的元素個數超過一個閥值( static final int TREEIFY_THRESHOLD = 8; )的時候,會將連結串列轉換為紅黑樹,所以如果雜湊衝突多的話,陣列的元素將會是紅黑樹。
引用:
https://blog.csdn.net/haihui_yang/article/details/80642520