1. 程式人生 > >HashTable、HashMap、LinkedHashMap、TreeMap之間的區別

HashTable、HashMap、LinkedHashMap、TreeMap之間的區別

 

 

Map介面

 

一: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