Hashtable,HashMap,ConcurrentHashMap之间的区别

目录

一、线程安全性

二、性能

三、空值支持

四、继承与实现关系

五、使用场景与总结表



一、线程安全性

  • Hashtable:线程安全 的。它的所有的方法几乎都被 synchronized 修饰,这意味着对Hashtable 的操作(如 put,get、remove 等)都会加锁,保证了多线程环境下的线程安全,但锁的粒度是整个 Hashtable 对象,多个线程操作不同的键值对时也会相互阻塞,导致并发性能低

  • HashMap:非线程安全的。在多线程环境下,若多个线程同时对 HashMap 进行修改操作(如 put 时触发扩容、链表转红黑树等),可能会出现死循环、数据丢失等问题

方法并未添加锁


  • ConcurrentHashMap:线程安全的。它采用了分段锁(Segment)(JDK1.7)或CAS + synchronized / Node 锁(JDK1.8)的方式实现线程安全
  1. JDK1.7:内部将哈希表分为多个 Segment ,每个 Segment 类似一个小的 Hashtable 线程操作不同的 Segment 时不会相互阻塞,只有操作同一个 Segment 时才会通过(ReentrantLock)保证线程安全,大大提高了并发性能
  2. JDK1.8:直接对每个桶(数组中的位置)的头节点加 synchronized 锁,同时结合CAS操作,进一步优化了并发性能

二、性能

  • Hashtable:由于全局加锁,在多线程高并发场景下,线程竞争激烈,性能较差
  • HashMap:非线程安全,单线程环境下性能优异,因为没有锁的开销
  • ConcurrentHashMap:在多线程高并发场景下性能远优于 Hashtable ,因为它的锁粒度更细,减少了线程之间的竞争;但线程场景下,性能略低于 HashMap (因为有少量的锁或 CAS 操作开销)

三、空值支持

  • Hashtable:****不允许键 (key) 或值 (value) 为 null 。如果尝试放入null ,会抛出NullPointerException
  • HashMap:****允许键 (key) 为 null (只能有一个 key 为空的键值对),也允许值(value)为null
  • ConcurrentHashMap不允许键或值为 null ,因为在并发环境下,null 作为值无法区分是 "键对应的值为null "还是 "键不存在",会带来线程安全问题,若放入 null 会抛出 NullPointerException

四、继承与实现关系

  • Hashtable**:**继承自 Dictionary 类,实现了 Map、Cloneable、Serializable 接口
  • **HashMap:**继承自 AbstractMap 类,实现了 Map、Cloneable、Serializble 接口
  • **ConcurrentHashMap:**继承自AbstractMap 类,实现了ConcurrentMap、Serializable 接口(ConcurrentMap 是 Map 的子接口)

五、使用场景与总结表

  • **Hashtable:**由于性能问题,现在很少使用,仅在有特定要求的情况下使用
  • **HashMapL:**适用于单线程环境或并发程度较低且能保证线程安全的情况
  • **ConcurrentHashMap:**适用于多线程高并发场景,需要保证线程安全的同时,尽可能提高并发性能,是线程安全哈希表的首选
特性 Hashtable HashMap ConcurrentHashMap
线程安全 是(全局synchronized 锁) 是(CAS+桶级synchronized 锁)
性能 高(单线程无锁) 高(细粒度锁,高并发下优秀)
允许 null 键 / 值 是(键仅一个,值可多个)
迭代器特性 fail-fast fail-fast 弱一致性
典型使用场景 极少新场景 单线程或低并发 多线程高并发

相关推荐
lzjava202414 分钟前
Spring AI实现一个智能客服
java·人工智能·spring
Mos_x20 分钟前
HeidiSQL导入与导出数据
java·后端
oak隔壁找我32 分钟前
Elasticsearch QueryBuilders 高级使用案例
java·后端
青云交35 分钟前
Java 大视界 -- Java 大数据在智能家居能源消耗模式分析与节能策略制定中的应用
java·大数据·智能家居·数据采集·能源消耗模式分析·节能策略制定·节能效果评估
小龙报35 分钟前
《算法通关指南:数据结构和算法篇 --- 顺序表相关算法题》--- 询问学号,寄包柜,合并两个有序数组
c语言·开发语言·数据结构·c++·算法·学习方法·visual studio
Zhang青山37 分钟前
【玩转全栈】----Django基本配置和介绍
java·后端
数据知道39 分钟前
Go语言设计模式:工厂模式详解
开发语言·设计模式·golang·go语言·工厂模式
AI视觉网奇1 小时前
coco json 分类标注工具源代码
开发语言·python
BUG?不,是彩蛋!1 小时前
Java Web 项目打包部署全解析:从 IDEA 配置到 Tomcat 运行
java·intellij-idea
勇敢牛牛_2 小时前
Rust真的适合写业务后端吗?
开发语言·后端·rust