Java-HashMap、Hashtable、ConcurrentHashMap的区别

本文详细对比了Java中的三种集合类HashMap, Hashtable和ConcurrentHashMap的数据结构、线程安全性、性能及扩容方式等关键特性。指出在需要线程安全的场景下推荐使用ConcurrentHashMap,在无需线程安全的场景下则使用HashMap。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是基于java1.8源码进行对比:

类型HashMapHashtableConcurrentHashMap
数据结构数组+链表+红黑树数组+链表数组+链表+红黑树
数组容量默认容量为16,且要求底层数组的容量一定为2的整数次幂默认容量为11,且不要求底层数组的容量一定为2的整数次幂默认容量为16,且要求底层数组的容量一定为2的整数次幂
是否支持NULL值支持不支持不支持
size获取size字段值count字段值通过累加baseCount和CounterCell数组中的数量,得到元素的总个数
hash计算方式key.hashCode() ^ (key.hashCode() >>> 16)key.hashCode()(key.hashCode() ^ (key.hashCode() >>> 16)) & 0x7fffffff
index计算方式(n - 1) & hash(hash & 0x7FFFFFFF) % tab.length(hash & 0x7FFFFFFF) % tab.length
是否线程安全
性能高低
线程安全实现方式synchronized对象锁,get、add、remove等方法不能同时进行CAS + synchronized保证多线程安全,可以同时执行多个方法
扩容方式单线程进行扩容(多线程进行扩容,可能会导致死循环造成CPU100%)单线程进行扩容单线程对新数组进行初始化,可多线程同步复制不同节点数据到新数组

 


HashTable是已过时的类,不建议再使用;总结:

  • 需要线程安全的场景,使用ConcurrentHashMap;
  • 无需线程安全,使用HashMap;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值