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。