相同之处
HashMap和Hashtable都实现了Map接口
不同之处
在于县线程安全性、同步(synchronization)以及速度
- HashMap是非synchronization的,并且key与value可以为null
- Hashtable是synchronization的,是线程安全的,Java5提供了ConcurrentHashMap,是Hashtable的替代,比HashTable拓展性更好
- HashMap的迭代器是fail-fast迭代器,而Hashtable的enumerator不是
- 单线程环境比HashMap慢
- hashtable的初始容量为11,增加时2n+1,hashmap为16,增加时2n
ConcurrentHashMap
- ConcurrentHashMap本质上是一个Segment数组,而一个Segment实例又包含若干个桶,每个桶中都包含由若干个HashEntry对象连接起来的链表
-HashMap重Hash,死循环 - 一个ConcurrentHashMap实例中包含由若干个Segment实例组成的数组,而一个Segment实例又包含由若干个桶,每个桶中都包含一条由若干个 HashEntry 对象链接起来的链表
- HashEntry用来封装具体的键值对,是个典型的四元组。与HashMap中的Entry类似,HashEntry也包括同样的四个域,分别是key、hash、value和next。不同的是,在HashEntry类中,key,hash和next域都被声明为final的,value域被volatile所修饰,因此HashEntry对象几乎是不可变的,这是ConcurrentHashmap读操作并不需要加锁的一个重要原因,由于value域被volatile修饰,所以其可以确保被读线程读到最新的值,这是ConcurrentHashmap读操作并不需要加锁的另一个重要原因
- 通过使用段(Segment)将ConcurrentHashMap划分为不同的部分,ConcurrentHashMap就可以使用不同的锁来控制对哈希表的不同部分的修改,从而允许多个修改操作并发进行, 这正是ConcurrentHashMap锁分段技术的核心内涵。