HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap區別

wangchun_166發表於2018-01-16
一、HashMap和TreeMap區別


      1、HashMap是基於雜湊表實現的,時間複雜度平均能達到O(1)。 TreeMap基於紅黑樹(一種自平衡二叉查詢樹)實現的,時間複雜度平均能達到O(log n)。

     2、HashMap、TreeMap都繼承AbstractMap抽象類;TreeMap實現SortedMap介面,所以TreeMap是有序的!HashMap是無序的

     3、兩種常規Map效能
          HashMap:適用於在Map中插入、刪除和定位元素。
          Treemap:適用於按自然順序或自定義順序遍歷鍵(key)。

     4.總結

       HashMap通常比TreeMap快一點(樹和雜湊表的資料結構使然),建議多使用HashMap,在需要排序的Map時候才用TreeMap。


二、HashMap和Hashtable的區別

      HashMap和Hashtable都實現了Map介面,但決定用哪一個之前先要弄清楚它們之間的分別。主要的區別有:執行緒安全性,同步(synchronization),以及速度。

      HashMap幾乎可以等價於Hashtable,除了HashMap是非synchronized的,並可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。
HashMap是非synchronized,而Hashtable是synchronized,這意味著Hashtable是執行緒安全的,多個執行緒可以共享一個Hashtable;而如果沒有正確的同步的話,多個執行緒是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴充套件性更好。
另一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當有其它執行緒改變了HashMap的結構(增加或者移除元素),將會丟擲ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會丟擲ConcurrentModificationException異常。但這並不是一個一定發生的行為,要看JVM。這條同樣也是Enumeration和Iterator的區別。
由於Hashtable是執行緒安全的也是synchronized,所以在單執行緒環境下它比HashMap要慢。如果你不需要同步,只需要單一執行緒,那麼使用HashMap效能要好過Hashtable。
HashMap不能保證隨著時間的推移Map中的元素次序是不變的。

我們能否讓HashMap同步?
HashMap可以通過下面的語句進行同步:

Map m = Collections.synchronizeMap(hashMap);

Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。


三、HashSet和HashMap的區別

      HashSet是基於HashMap實現的。

      HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap區別

四、ConcurrentMap

ConcurrentHashMap 表現區別:不可以有null鍵,執行緒安全,原子操作。一個ConcurrentHashMap 由多個segment 組成,每個segment 包含一個Entity 的陣列。這裡比HashMap 多了一個segment 類。該類繼承了ReentrantLock 類,所以本身是一個鎖。當多執行緒對ConcurrentHashMap 操作時,不是完全鎖住map, 而是鎖住相應的segment 。這樣提高了併發效率。缺點:當遍歷ConcurrentMap中的元素時,需要獲取所有的segment 的鎖,使用遍歷時慢。鎖的增多,佔用了系統的資源。使得對整個集合進行操作的一些方法

五、LinkedHashMap是HashMap的一個子類

LinkedHashMap儲存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的.也可以在構造時用帶引數,按照應用次數排序。在遍歷的時候會比HashMap慢,不過有種情況例外,當HashMap容量很大,實際資料較少時,遍歷起來可能會比LinkedHashMap慢,因為LinkedHashMap的遍歷速度只和實際資料有關,和容量無關,而HashMap的遍歷速度和他的容量有關。

六、java為資料結構中的對映定義了一個介面java.util.Map;它有四個實現類,分別是HashMap Hashtable LinkedHashMap 和TreeMap.



相關文章