HashMap,Hashtable和ConcurrentHashMap
HashMap和Hashtable的區別
主要有三方面:線程安全性,同步以及速度
- HashMap可以接受null的鍵和null的值,而Hashtable不行
- HashMap是非synchronized,而Hashtable是synchronized,所以Hashtable是線程安全的,多個線程可以共享同一個Hashtable,而HashMap不行。可以使用Collections.synchronizedMap(Map<K,V> m)方法來從HashMap中獲取線程安全的Map。
- 因為Hashtable是線程安全的,需要進行同步,所以單線程環境下速度比HashMap慢。
ConcurrentHashMap和Hashtable的區別
- Java5引入了ConcurrentHashMap
- Hashtable和ConcurrentHashMap都可以用于多線程環境,但是和Collections.synchronizedMap方法獲取的
線程安全的Map一樣,Hashtable僅有單個鎖,對整個集合加鎖。所以當Hashtable的大小增到一定程度時候,性能
會急劇下降,因為迭代時需要整個集合需要被鎖定更長的時間。 - ConcurrentHashMap中引入分割(segmentation),無論它變得多大,僅僅需要鎖定map的某個部分,而其它的線程不需要
等到迭代完成才能訪問map。
ConcurrentHashMap僅僅鎖定map的某個部分,而Hashtable則會鎖定整個map。