ConcurrentHashMap在JDK1.7和JDK1.8中的区别

ConcurrentHashMap在JDK1.7和JDK1.8中的区别,第1张

ConcurrentHashMap在JDK1.7和JDK1.8中的区别

最近在学习到ConcurrentHashMap的时候发现了一个很有趣的问题,ConcurrentHashMap在JDK1.7和JDK1.8中的结构和底层实现好像有点不太一样的地方。

1.JDK1.7中的ConcurrentHash

结构图如下:

从图中可以以看到,在JDK1.7中,ConcurrentHashMap的数据结构是由一个Segment数组和多个HashEntry组成的,而每个Segment中由多个HashEntry组成HashEntry数组,而每个HashEntry数组中的节点又代表每个链表的头节点。

2.JDK1.8中的ConcurrentHash

结构图如下:

从图中可以以看到,在JDK1.8中,ConcurrentHashMap的数据结构是由一个Node数组和链表组成的,如果了解过HashMap的朋友可能看出来了,这个结构和HashMap的底层就够是一样的。当然如果链表节点大于阙值则会转换为红黑树,只不过在图中没有画出。

3.方法上的差异

在JDK1.7中ConcurrentHashMap执行get,put等方法时会先hash一次来确定数据处于哪个分段(Segment),然后在hash确定在HashEntry数组中的位置,最后再到链表中查找。ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEntry 用来封装映射表的键 / 值对,在HashEntry数组中每个元素可以看作一个Entry对象;Segment 用来充当锁的角色,每个 Segment 对象守护整个散列映射表的若干个桶。每个桶是由若干个 HashEntry对象链接起来的链表。一个 ConcurrentHashMap 实例中包含由若干个 Segment 对象组成的数组。
在JDK1.8中ConcurrentHashMap执行get,put等方法时就和HashMap大差不差了,都是通过一次hash确定Node节点的位置,然后再到链表中去。而HashMap中的Node是一个静态内部类,实现了Map.Entry接口,因此每个Node可以看作一个Entry对象。

本文只是学习过程中了解到了,研究的不是很深,只是一些表面的东西,就随手记下来了。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5582062.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存