HashMap,Hashtable和ConcurrentHashMap
HashMap和Hashtable的區(qū)別
主要有三方面:線程安全性,同步以及速度
- HashMap可以接受null的鍵和null的值炬搭,而Hashtable不行
- HashMap是非synchronized忍坷,而Hashtable是synchronized,所以Hashtable是線程安全的深胳,多個(gè)線程可以共享同一個(gè)Hashtable绰疤,而HashMap不行∥柚眨可以使用Collections.synchronizedMap(Map<K,V> m)方法來從HashMap中獲取線程安全的Map轻庆。
- 因?yàn)镠ashtable是線程安全的,需要進(jìn)行同步敛劝,所以單線程環(huán)境下速度比HashMap慢余爆。
ConcurrentHashMap和Hashtable的區(qū)別
- Java5引入了ConcurrentHashMap
- Hashtable和ConcurrentHashMap都可以用于多線程環(huán)境,但是和Collections.synchronizedMap方法獲取的
線程安全的Map一樣夸盟,Hashtable僅有單個(gè)鎖蛾方,對整個(gè)集合加鎖。所以當(dāng)Hashtable的大小增到一定程度時(shí)候上陕,性能
會急劇下降桩砰,因?yàn)榈鷷r(shí)需要整個(gè)集合需要被鎖定更長的時(shí)間。 - ConcurrentHashMap中引入分割(segmentation)释簿,無論它變得多大亚隅,僅僅需要鎖定map的某個(gè)部分,而其它的線程不需要
等到迭代完成才能訪問map庶溶。
ConcurrentHashMap僅僅鎖定map的某個(gè)部分煮纵,而Hashtable則會鎖定整個(gè)map。