HashMap, HashTable, CurrentHashMap的區別
轉載:http://www.jianshu.com/p/c00308c32de4html
HashMap vs ConcurrentHashMap
引入ConcurrentHashMap
是爲了在同步集合HashTable之間有更好的選擇,HashTable
與HashMap
、ConcurrentHashMap
主要的區別在於HashMap不是同步的、線程不安全的和不適合應用於多線程併發環境下,而ConcurrentHashMap
是線程安全的集合容器,特別是在多線程和併發環境中,一般做爲Map
的主要實現。除了線程安全外,他們之間還有一些細微的不一樣,本文會介紹到。順便說說,HashMap
和ConcurrentHashMap
還有ConcurrentHashMap
和Hashtable
二者之間的區別在Java面試中常常出現,特別是高級Java程序員。java
HashMap與ConcurrentHashMap的區別
在這部分,咱們會看到更多關於HashMap
和ConcurrentHashMap
的細節和對比它們之間的參數好比線程安全、同步、性能和基本的使用。git
- 就像上面所說他們之間的第一個重要的區別就是
ConcurrentHashMap
是線程安全的和在併發環境下不須要加額外的同步。雖然它不像Hashtable
那樣須要一樣的同步等級(全表鎖),但也有不少實際的用途。 - 你可使用
Collections.synchronizedMap(HashMap)
來包裝HashMap做爲同步容器,這時它的做用幾乎與Hashtable
同樣,當每次對Map
作修改操做的時候都會鎖住這個Map
對象,而ConcurrentHashMap
會基於併發的等級來劃分整個Map來達到線程安全,它只會鎖操做的那一段數據而不是整個Map
都上鎖。 ConcurrentHashMap
有很好的擴展性,在多線程環境下性能方面比作了同步的HashMap
要好,可是在單線程環境下,HashMap
會比ConcurrentHashMap
好一點。
總結一下以上二者的區別,它們在線程安全、擴展性、同步之間的區別。若是是用於緩存的話,ConcurrentHashMap
是一個更好的選擇,在Java應用中會常常用到。ConcurrentHashMap
在讀操做線程數多於寫操做線程數的狀況下更勝一籌。程序員
ConcurrentHashMap vs Hashtable vs Synchronized Map
雖然三個集合類在多線程併發應用中都是線程安全的,可是他們有一個重大的差異,就是他們各自實現線程安全的方式。Hashtable
是jdk1的一個遺棄的類,它把全部方法都加上synchronized
關鍵字來實現線程安全。全部的方法都同步這樣形成多個線程訪問效率特別低。Synchronized Map
與HashTable
差異不大,也是在併發中做相似的操做,二者的惟一區別就是Synchronized Map
沒被遺棄,它能夠經過使用Collections.synchronizedMap()
來包裝Map
做爲同步容器使用。面試
另外一方面,ConcurrentHashMap
的設計有點特別,表如今多個線程操做上。它不用作外的同步的狀況下默認同時容許16個線程讀和寫這個Map容器。由於其內部的實現剝奪了鎖,使它有很好的擴展性。不像HashTable
和Synchronized Map
,ConcurrentHashMap
不須要鎖整個Map,相反它劃分了多個段(segments),要操做哪一段才上鎖那段數據。緩存
坦白說,集合類是一個最重要的Java API,我以爲恰當的使用它們是一種藝術。依我我的經驗,我會使用ArrayList
這些容器來提升本身的Java程序的性能,而不會去用一些遺棄的容器好比Vector
等等,在Java 5以前,Java集合容器有一個很致命的缺陷就是缺少可擴展性。
同步集合類好比Hashtable
和Vector
在多線程Java應用裏面逐漸成爲障礙物;在jdk5後出現一些很好的併發集合,對大容量、低延遲的電子交易系統有很大影響,是快速存取數據的支柱。安全