HashMap和ConcurrentHashMap的底层实现原理

news/2024/11/17 6:57:04/文章来源:https://www.cnblogs.com/kenwan/p/18294954

(1)HashMap底层实现原理

JDK 1.7 版本之前, HashMap 数据结构是数组和链表,HashMap 通过哈希算法将元素的键 (Key) 映射到数组中的槽位 (Bucket)。如果多个键映射到同一个槽位,它们会以链表的形式存储在同一个槽位上,因为链表的查询时间是 O(n),所以冲突很严重,一个索引上的链表非常长,效率就很低了。

 所以在 JDK 1.8 版本的时候做了优化,当一个链表的长度超过8的时候就转换数据结构,不再使用链表存储,而是使用红黑树,查找时使用红黑树,时间复杂度 O(logn),可以提高查询性能,但是在数量较少时,即数量小于6时,会将红黑树转换回链表。

 

(2)ConcurrentHashMap

JDK1.7 中它使用的是数组加链表的形式实现的,而数组又分为:大数组 Segment 和小数组 HashEntry。Segment 是一种可重入锁 (ReentrantLock),在 ConcurrentHashMap 里扮演锁的角色;HashEntry 则用于存储键值对数据。一个 ConcurrentHashMap 里包含一个 Segment 数组,一个 Segment 里包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素。简单理解就是,ConcurrentHashMap 是一个 Segment 数组,Segment 通过继承 ReentrantLock 来进行加锁,所以每次需要加锁的操作锁住的是一个 Segment,这样只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全。

JDK1.8 也引入了红黑树,优化了之前的固定链表,那么当数据量比较大的时候,查询性能也得到了很大的提升,从之前的 O(n) 优化到了 O(logn) 的时间复杂度。ConcurrentHashMap 主要通过 volatile + CAS 或者 synchronized 来实现的线程安全的,ConcurrentHashMap 通过对头结点加锁来保证线程安全的,锁的粒度相比 Segment 来说更小了,发生冲突和加锁的频率降低了,并发操作的性能就提高了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/741908.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Azure Key Vault】关于Key Vault使用的几个问题

问题一:Key Vault 和 Event Grid 通过将 Key Vault 与事件网格集成,可以在密钥保管库中存储的机密的状态发生更改时收到通知。 状态更改将定义为即将到期的机密(到期前 30 天)、已过期的机密或具有可用新版本的机密。 支持所有三种机密类型(密钥、证书和机密)的通知。无法…

利用Selenium和PhantomJS绕过接口加密的技术探索与实践

本文介绍了如何利用Selenium结合PhantomJS绕过网站接口加密的方法,详细分析了实现过程中的关键步骤和技术挑战。此外,文章还包括一个具体案例:使用该技术爬取振坤行商品信息的实例,展示了该技术在实际网络数据采集中的应用和效果。selenium+phantomjs绕过接口加密 我们为什…

Profinet转ModbusTCP网关模块连发那科机器人与DCS通讯

本文介绍了使用巴图自动化Profinet转ModbusTCP网关(BT-ETHPN20)配置通讯,实现DCS与发那科机器人间数据传递的步骤。巴图自动化Modbus转Profinet网关模块(BT-MDPN10)集成了Modbus协议和Profinet协议,具有将Modbus和Profinet协议互转的能力,且支持Modbus RTU主从站。Profine…

动手学Avalonia:基于硅基流动构建一个文生图应用(一)

本文为动手学Avalonia:基于硅基流动构建一个文生图应用系列(一)。文生图 文生图,全称“文字生成图像”(Text-to-Image),是一种AI技术,能够根据给定的文本描述生成相应的图像。这种技术利用深度学习模型,如生成对抗网络(GANs)或变换器(Transformers),来理解和解析…

APP抓包神器drony

APP抓包神器drony 当你想抓app的包,但是charles却很多包没有,甚至很多请求都是unknown,这个时候用Drony就很好用了,将charles打开,用drony来转发app的所有请求,而不是直接设置手机wifi代理。 1:安装drony (这里手机使用的Android设备)您可以在网络上搜索drony选择自己…

主成分分析及其matlab实现

本讲将介绍主成分分析(Principal Component Analysis,PCA),它能将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且彼此之间互不相关。一般来说,当研究的问题涉及到多变量且变量之间存在很强的相关性时,我们可考虑使用主成分分析的方法来对数据进行简化。…

关于ComfyUI的一些Tips

关于ComfyUI的一些Tips 前言: 最近发的ComfyUI相关文章节奏不知道会不会很快,在创作的时候没有考虑很多,想着把自己的知识分享出去。后台也看到很多私信,有各种各样的问题,这是我欠缺考虑了,今天这篇文章呢,根据私信的问题我大致整理了一下,给大家一些小tips。 目录 一…

2024暑假集训测试2

前言比赛链接。T1、T4 比较简单,打完基本就罚坐了,想了三个小时的 T2、T3 也没想出来。 T1 酸碱度中和 二分答案加贪心即可,先排序,每瓶可装 \(a_i\sim a_i+2*m\)。点击查看代码 #include<bits/stdc++.h> #define int long long #define endl \n #define sort stable…

HAJX[2024] 15Day游记

洛谷食用 博客食用 简介:这是一个正在学习C++的OIer(很蒻很蒻)的日常记录。 (注:2024.7.5-7.20集训日更) 放在前面: 本贴只是记录一下本蒟蒻的生活,(太菜了),佬们轻喷谢谢~浏览次数:(由于网站原因可能无法显示,属于正常现象)Day 0 期待集训ing 。0-上午 在来的路上…

闲话 24.7.10

另类的……杨图!闲话 啊,zzz 真好玩啊! 慢热型,战斗非重点,美术风格超赞。如果不排斥米家 f2p 游戏,推荐大家玩一玩。 我是冲着妹妹去的 未来会补一些杨表公式的证明。现在先咕! 推歌:辰砂 by Licis et al. feat 洛天依AI 增补:另类杨图对应杨表计数 前置知识:杨表 什…

量化交易入门:如何在QMT中配置Python环境,安装第三方依赖包

哈喽,大家好,我是木头左!引言 QMT,作为量化交易系统中的佼佼者,以其强大的功能和灵活的操作性,受到了广大投资者的青睐。但是,对于很多新手来说,如何在QMT中配置Python环境,安装第三方依赖包,却是一个让人头疼的问题。本文将从零开始,手把手教你如何在QMT中配置Pyth…

uniapp-Java使用AES加密解密

操作前 uniapp 需要安装 npm install crypto-js 在需要使用的界面加入 import CryptoJS from crypto-js java端<!-- spring security 安全认证 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-s…