【编程底层原理】HashMap Hashtable ConcurrentHashMap

在Java的不同版本中,集合的实现原理有所变化,尤其是在HashMapHashtableConcurrentHashMap这三种实现中。以下是它们的一些关键区别和实现原理:

一、HashMap

  • JDK 1.7HashMap使用数组和链表的组合来解决冲突。当一个桶(数组的每个位置)中的元素超过一定数量时,会使用链表来存储这些元素。HashMap在JDK 1.7中不是线程安全的。
  • JDK 1.8:进行了优化,当链表的长度超过一定阈值(默认为8)时,会将链表转换为红黑树,以提高搜索效率。这种结构变化使得HashMap在面对大量元素时性能更优。此外,JDK 1.8中的HashMap引入了Node类代替了之前的Entry类,并且增加了对null键和值的支持。

二、Hashtable:

  • Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。两者都实现了Map接口。
  • Hashtable不允许键(key)或值(value)为null,并且是线程安全的。它通过在每个方法上使用synchronized关键字来实现线程安全,这可能导致在高并发环境下的性能问题。

三、ConcurrentHashMap:

  • ConcurrentHashMap在JDK 1.7中使用分段锁(Segment)的概念来实现线程安全,这意味着它将哈希表分成多个段,每个段有自己的锁,从而允许多个线程可以同时访问不同段的数据,提高了并发性能。
  • 到了JDK 1.8,ConcurrentHashMap摒弃了分段锁的概念,采用了一种类似于HashMap但在每个桶上使用synchronized和CAS(Compare-And-Swap)操作的方式来实现线程安全。这种实现提高了性能,并且使得ConcurrentHashMap在JDK 1.8中看起来更像是一个优化过的线程安全的HashMap

四、总结:

  • HashMap是非线程安全的,适用于单线程环境。
  • Hashtable是线程安全的,通过同步方法实现,但性能较低。
  • ConcurrentHashMap是线程安全的,通过更细粒度的锁设计提高了并发性能。
    在设计系统时,应根据具体需求选择合适的集合类型,并考虑到线程安全和性能等因素。如果需要线程安全的HashMap,可以使用Collections.synchronizedMap包装一个HashMap,或者使用ConcurrentHashMap
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dylanioucn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值