库调多了,都忘了最基础的概念 -HashMap 篇

简介: 库调多了,都忘了最基础的概念 -HashMap 篇

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家

📌 擅长领域:全栈工程师、爬虫、ACM算法

💒 公众号:知识浅谈

温馨提醒:由于内容较好,请18岁以上成年人观看

🤞这次都给他拿下🤞

🎈说一下HashMap底层实现?及元素添加流程?

因为JDK1.7和JDK1.8是有区别的,所以按照不同的版本记录

JDK1.7版本:

  1. 底层结构使用数组+链表的方式实现。
  2. 数组中最初的大小为16个节点,阈值为0.75,当达到阈值的时候进行扩容,扩容每次扩容为原来的2倍。
  3. 链表插入节点的时候使用头插法。

😉元素添加的过程:这个版本的元素添加是先判断是否达到阈值,即先扩容,后添加。

添加的时候找到对应的位置,如果为空进行赋值,否则如果是链表采用头插法把值插入。

🧐存在的问题:存在循环链表和值覆盖的问题。

JDK1.8版本:

  1. 底层结构使用数组+链表+红黑树的方式实现。
  2. 数组中最初的大小为16个节点,阈值为0.75,当达到阈值的时候进行扩容,扩容每次扩容为原来的2倍,相比于JDK1.7还有一点就是当链表的节点数大于8且整个map中元素的个数大于64的时候,链表转化为红黑树,当链表中的节点数小于6的时候,红黑树退化为链表。
  3. 链表插入节点的时候使用尾插法。

😉元素添加的过程:这个版本的元素添加是先添加,后判断是否进行扩容。

添加的时候找到对应的位置,如果为空进行赋值,否则如果是链表采用尾部插法把值插入,否则如果是红黑树,则在红黑树中插入对应的节点。

🧐存在的问题: 解决了循环链表的问题,但是仍然存在值覆盖的问题。

🎈为什么HashMap会产生死循环?

这个死循环就是上边提到的循环链表的问题,这个问题是发生在扩容的时候,当多个线程进行节点并发插入的时候,都需要进行扩容,一个线程扩容完,另一个线程本来在前一个线程扩容之前已经指向原本的头节点,扩容之后头节点指向的next节点变化了,当第二个线程扩容的时候就行成了循环。

🎈HashMap除了死循环之外,还有什么问题?

正如上边提到的,除了死循环,还有值覆盖的问题,就是当数组中的一个节点为空的时候两个元素要同时插入的时候当一个节点获取了位置要插入的时候,时间片到了,另一个线程插入了,之后到另一个线程的时候也进行了插入,就把之前的给覆盖了。

🎈为什么ConcurrentHashMap是线程安全的?

📐JDK1.7版本:

使用分段锁的形式,即用segment数组来进行加锁的形式,每个锁下记录一个数组+链表的结构,这个数组的初始值和阈值为16和0.75,同理每个segment下都是如此,为什么concurrentHashMap是安全的,就是因为当修改的时候先锁住一个段下的所有内容进行修改,如果不同段中的数据,是可以并行修改的。

📐JDK1.8版本:

采用Synchronized+CMS的形式,就是对数组中每个节点加synchronized的形式,然后在进行扩容,sychronized锁住结点之后使用CMS的方法进行扩容,并且还支持并发扩容,也就是可以多个线程同时进行扩容,且扩容不用计算hash值,如果之前的hash大于原来的数组则就把当前节点移动到当前节点+原数组长度的位置。

🍚总结

以上就是关于hashmap的简单理解,太深了我也不太理解,希望有所帮助。

相关文章
|
前端开发 Android开发
Jetpack Compose 学习指南(二)
Jetpack Compose 学习指南(二)
431 0
|
Python
使用Python将文本转换成语音?
使用Python将文本转换成语音?
710 0
|
人工智能 关系型数据库 OLAP
光云科技 X AnalyticDB:构建 AI 时代下的云原生企业级数仓
AnalyticDB承载了光云海量数据的实时在线分析,为各个业务线的商家提供了丝滑的数据服务,实时物化视图、租户资源隔离、冷热分离等企业级特性,很好的解决了SaaS场景下的业务痛点,也平衡了成本。同时也基于通义+AnalyticDB研发了企业级智能客服、智能导购等行业解决方案,借助大模型和云计算为商家赋能。
984 17
|
存储 关系型数据库 MySQL
云计算|OpenStack|社区版OpenStack安装部署文档(四 --- 镜像服务glance安装部署---Rocky版)
云计算|OpenStack|社区版OpenStack安装部署文档(四 --- 镜像服务glance安装部署---Rocky版)
665 0
|
消息中间件 安全 Java
VCTGO:一款让开发者直呼“真香”的企业级快速开发平台,你绝对不能错过!
嗨,大家好,我是小华同学。关注我们获取“最新、最全、最优质”的开源项目和高效工作学习方法。今天为大家介绍一款企业级快速开发平台——VCTGO。基于Spring Boot + Vue.js,VCTGO提供用户管理、菜单管理、角色管理、日志管理、代码生成、系统监控等核心功能,支持从开发到部署的一站式解决方案。技术架构采用主流技术栈,包括前端Vue.js + Element UI,后端Spring Boot + MyBatis Plus,数据库MySQL,缓存Redis,消息队列RabbitMQ,
400 27
|
弹性计算 安全 网络安全
转发路由器 Transit Router(TR):实现企业级互联网络的灵活与可靠
转发路由器 Transit Router(简称“TR”)是地域范围内企业级核心转发网元,可为用户转发同地域或不同地域的网络实例间的流量,并支持在地域内定义灵活的互通、隔离、引流策略,帮助用户打造一张灵活、可靠、大规模的企业级互联网络。通过搭配云数据传输(简称“CDT”),用户可实现跨地域连接场景数据传输按流量计费的能力。
|
人工智能 搜索推荐 Serverless
云端问道22期——AI智能语音实时互动
《云端问道22期——AI智能语音实时互动》分享了构建用户与AI智能语音实时互动的方法,涵盖七个部分:进入解决方案页、方案介绍、操作步骤、创建AI智能体、实时工作模版、部署应用及应用体验。通过阿里云平台,用户可以快速部署并体验AI语音通话功能,包括语音转文字、文字转语音、个性化定制智能体人设及接入私有知识库等。整个过程简单流畅,适合开发者和企业快速上手。
810 8
|
存储 监控 物联网
医疗物联网设备精细化管理系统解决方案
华汇数据智慧医院物联网管理系统解决方案是一种集物联网、云计算、大数据和人工智能等先进技术于一体的综合性解决方案,旨在提升医院的运营效率、医疗质量和患者满意度。
549 3
|
Java 项目管理 Maven
Lombok 安装及使用指南
Lombok 安装及使用指南
943 0
Lombok 安装及使用指南

热门文章

最新文章