HashMap、HashTable和ConcurrentHashMap的区别

文章详细比较了HashMap、HashTable和ConcurrentHashMap在线程安全、数据结构以及不同JDK版本下的实现策略。HashMap非线程安全,JDK1.8引入红黑树减少哈希冲突。HashTable全局同步,效率低。ConcurrentHashMap使用锁分段技术或更细粒度的锁提高并发性能。
摘要由CSDN通过智能技术生成

简单总结一下面试中常问的HashMap、HashTable和ConcurrentHashMap的区别。

一、HashMap

是否线程安全: 否。

底层结构:

  1. jdk1.7时,底层结构为 数组 + 链表。
  2. jdk1.8时,底层结构为 数组 + 链表 + 红黑树。

红黑树与链表的转换规则:

  1. 如果链表中节点个数超过8时,链表转化为红黑树。
  2. 如果红黑树中节点小于6时,红黑树退还为链表。
  3. 如果哈希桶中某条链表的个数超过8,且桶的个数超过64时会将链表转换为红黑树,否则会扩容。

PS:

计算哈希值的代码中 (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16) 的作用?

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

答: 减少哈希碰撞的概率,使散列更加均匀。

二、HashTable

是否线程安全:

效率: HashTable所有的方法都使用synchronized加锁,像一些读操作不存在线程不安全问题它也进行了加锁,这就导致了效率低下,所以HashTable已经被丢弃不再使用了。

三、ConcurrentHashMap

是否线程安全: 是。

jdk1.7:

  1. jdk1.7时,底层结构为 segment数组 + 链表。

  2. 采用技术:锁分段技术,即将数组分成若干个段,然后对这些段进行加锁,这样就可以根据不同的段进行并发操作。

  3. 继承ReentrantLock实现同步锁机制。

在这里插入图片描述

jdk1.8:

  1. jdk1.8时,底层结构为 Node数组 + 链表 + 红黑树
  2. 采用技术:将数组中的每个位置都分别加锁,相较于1.7版本将锁更加细化,大大降低了锁冲突的概率。
  3. CAS+synchronized实现同步锁机制。

在这里插入图片描述

jdk1.7与jdk1.8共同点: 它们的读操作都没有加锁,而是使用了volatile关键字,保证了每次读取到的都是内存中的最新值;读写效率都比较高,因为读操作是无锁的,可以并发执行,写操作锁的是Segment/Node,所以对同一个Segment/Node读操作是有锁冲突的,对不同的Segment/Node读操作是没有冲突的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

木木是木木

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

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

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

打赏作者

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

抵扣说明:

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

余额充值