栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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对象。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/590866.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号