ConcurrentHashMap 和 Hashtable 的区别是什么?
时间: 2023-11-16 09:26:19 浏览: 85
ConcurrentHashMap 和 Hashtable 都是线程安全的 Map 实现,它们的主要区别如下:
1. 处理方式不同:Hashtable 使用 synchronized 关键字对整个方法进行同步,而 ConcurrentHashMap 则使用分段锁技术(Segment)对 Map 进行分段,每个段(Segment)上都有一个锁,只锁定当前需要操作的段,不影响其他段,因此在多线程并发访问时,效率更高。
2. 扩容方式不同:Hashtable 的扩容是扩大为原来的 2 倍加 1,而 ConcurrentHashMap 则是采用分段锁技术(Segment)实现,每个段(Segment)会有一个默认的大小,当该段(Segment)中的元素个数大于阈值时,只会对该段进行扩容,而不是整个 Map 进行扩容。
3. 允许 null 值和 null 键:Hashtable 不允许 null 值和 null 键,而 ConcurrentHashMap 允许 null 值和 null 键。
4. 遍历方式不同:Hashtable 的 Enumeration 遍历方式是不安全的,而 ConcurrentHashMap 的 Iterator 遍历方式是安全的,因为 ConcurrentHashMap 在迭代时不会抛出 ConcurrentModificationException 异常。
总之,ConcurrentHashMap 是 Java 5 引入的高效线程安全的 Map 实现,相对于 Hashtable,它在并发性能上有很大的优势,而且允许 null 值和 null 键。
阅读全文