【Java基础】HashMap的底层数据结构是怎样的?
HashMap就是以Key-Value的方式进行数据存储的一种数据结构。
HashMap在jdk1.7之前和jdk1.8之后的底层数据结构是不一样的。
在jdk1.7之前是数组+链表的形式,并通过entry节点保存key和value值;当Hash冲突比较严重的时候,在数组上形成的链表就会变的越来越长,由于链表是不支持索引查询的,所以这个时候要想在链表中找一个元素的话就需要遍历一遍链表,最坏的结果是查找的元素在链表的末尾,这样显然会导致查询效率大大降低;
所以为避免这一问题的发生,在jdk1.8加入了红黑树,红黑树是一个自平衡的二叉查找树,使用红黑结点并使得两端保持相对平衡;所以jdk1.8后HashMap的底层数据结构是数组+链表+红黑树的形式。
Jdk8开始当链表高度到8、数组长度超过64时,会将链表转为红黑树,元素以内部类使用Node类存储Key和Value。
通过计算key的hash值,进行二次hash然后对数组长度进行取模,获得对应数组下标; 获得下标后,会先判断下标位置是否存在元素,如果下标位置没有元素,则直接创建Node存入数组;如果存在元素就会产生hash冲突;
冲突产生后,先对key值进行equals()比较,如果key值相同则取代该元素,不同则通过尾插法插入链表,在插入的同时遍历链表计算高度,如果中途存在key值相同的元素则进行覆盖;如果没有就直接插入到链表尾部。
插入完成,对链表高度进行判断,如果链表高度达到8,并且数组长度到64则转变为红黑树;反之,如果红黑树结点低于等于6则会退化为链表。
注意,如果Key为null的话,则存在下标0的位置上。
jdk7中HashMap底层数据结构图:

jdk8中HashMap底层数据结构图:

——》以上讲述了HashMap底层数据结构是怎样的,同时这个题也是面试的高频提问题。在回答过程中,还穿插 了为什么在jdk8要加入红黑树这一问题。以上是自己总结的面试题,根据自我理解和查找资料得出,欢迎各位CSDN的友友们前来指教!
相关文章:
【Java基础】HashMap的底层数据结构是怎样的?
HashMap就是以Key-Value的方式进行数据存储的一种数据结构。 HashMap在jdk1.7之前和jdk1.8之后的底层数据结构是不一样的。 在jdk1.7之前是数组链表的形式,并通过entry节点保存key和value值;当Hash冲突比较严重的时候,在数组上形成的链表就会…...
MongoDB5副本集高可用集群部署
MongoDB5副本集高可用集群部署 1.MongoDB简介 MongoDB官方网站:https://www.mongodb.com MongoDB最大的特点是表结构灵活可变,字段类型可以随时修改。MongoDB中的每一行数据只是简单的被转化成Json格式后存储,因此MongoDB中没有MySQL中表…...
【Java】最新版本SpringCloudStream整合RocketMQ实现单项目中事件的发布与监听
文章目录前言依赖配置代码参考前言 SpringCloud项目中整合RocketMQ是为了削峰填谷。 这里我使用RocketMQ的作用用于接收项目中产生的消息,然后异步的发送邮件给客户,这是这个项目的产生的背景。 依赖配置 <dependencies><dependency><…...
abp.net 5.0 部署IIS10
今天遇到了abp.net 5.0部署iis10被卡住的问题,网上找了一些资料,都不是我要的,最后我总结一下我用的是 5.0的版本,所以我需要给服务器安装 iis5.0的相关运行环境 1:https://dotnet.microsoft.com/zh-cn/download/dotne…...
Windows安装Qt与VS2019添加QT插件
一、通过Qt安装包方式http://download.qt.io/archive/qt/5.12/5.12.3/.安装可以就选中这个MSVC 2017 64-bit,其他就暂时不用了二、通过vs2019安装Qt插件方式方法1下面这种方式本人安装不起来,一直卡住下不下来。拓展->管理拓展->联机->搜索Qt&a…...
自学大数据第5天~hadoop集群搭建(二)
配置集群/分布式环境 1,修改文件workers 需要把所有节点数据节点的主机名写入该文件,每行一个,默认localhost(即把本机(namenode也作为数据节点),所以我们在伪分布式是没有配置该文件; 在进行分布式时需要删掉localhost(又可能文件中没有该配置,没有那就不用删了,配置一下数据…...
MySQL (六)------MySQL的常用函数、 事务(TCL)、DCL用户操作语句、常见环境、编码问题
第一章 MySQL的常用函数 1.1 字符串函数 1.1.1 字符串函数列表概览 函数用法CONCAT(S1,S2,......,Sn)连接S1,S2,......,Sn为一个字符串CONCAT_WS(separator, S1,S2,......,Sn)连接S1一直到Sn,并且中间以separator作为分隔符CHAR_LENGTH(s)返回字符串s的字符数LENGTH…...
【3.8】操作系统内存管理、Redis数据结构、哈希表
内存满了,会发生什么? 当应用程序读写了这块虚拟内存,CPU 就会去访问这个虚拟内存, 这时会发现这个虚拟内存没有映射到物理内存, CPU 就会产生缺页中断,进程会从用户态切换到内核态,并将缺页中…...
Shell编程:轻松掌握入门级Shell脚本,成为Shell高手
文章目录前言一. 实验环境二. shell基础入门精讲2.1 什么是shell脚本?2.2 shell的种类2.3 脚本案例2.3.1 打印 hello-word案例2.3.2 统计指定目录下的文件数和目录数2.4 shell脚本编写规范总结前言 🏠个人主页:我是沐风晓月 🧑个人…...
FastApi的搭建与测试
一、fastapi的安装 1-1、使用pip安装 安装fastapi的语句 pip install fastapi -i https://mirrors.aliyun.com/pypi/simple因为fastapi启动依赖于uvicorn,所以我们还需要安装uvicorn。 pip install uvicorn -i https://mirrors.aliyun.com/pypi/simple下面我们来…...
C++基础——C++面向对象之重载与多态基础总结(函数重载、运算符重载、多态的使用)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…...
调用一个函数时发生了什么?
欢迎来到 Claffic 的博客 💞💞💞 前言: 用C语言写代码,如果一个工程相对复杂时,我们往往会采取封装函数的方式。在主函数中调用函数 这一看似简单的过程,实际上有很多不宜观察的细节࿰…...
MindAR的网页端WebAR图片识别功能的图片目标编译器中文离线版本功能(含源码)
前言 之前制作了基于MindAR实现的网页端WebAR图片识别叠加动作模型追踪功能的demo,使用了在线的图像目标编译器对识别图进行了编译,并实现了自制的WebAR效果,大致效果如下: 但是在线的编译器在操作中也不是很方便,我…...
测试经理:“你做了三年测试,连服务端的接口测试都不会?”
服务端的接口测试我们一般从功能开始进行测试,比如请求参数和响应参数的校验,业务逻辑或业务规则的校验,数据库操作的校验。 功能正常后会根据需要进行安全相关的检查、性能测试以及系列扩展测试,比如与历史版本的兼容性测试、接…...
4G AFR到5G应用场景介绍
前面文章介绍过AFR的机制及流程 AFR机制及流程介绍 (qq.com) GSM AFR到LTE流程...
正电源子 IMX6ULL 自学笔记(驱动开发)
一、字符设备驱动开发 1.1 字符设备驱动简介 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、IIC、SPI,LCD 等等都…...
AM5728(AM5708)开发实战之移植OpenCV-3.4.11
一 概述 OpenCV是一个开源的跨平台计算机视觉库,可以运行在Linux、Windows、Mac OS等操作系统上,它为图像处理、模式识别、三维重建、物体跟踪、机器学习提供了丰富的算法。 由于OpenCV依赖包特别多,尽量不要使用交叉编译,即在什…...
Notepad++ 下载与安装教程
文章目录Notepad 下载与安装教程Notepad 简介一,Notepad 下载二,Notepad 安装Notepad 下载与安装教程 Notepad 简介 Notepad是程序员必备的文本编辑器,Notepad中文版小巧高效,支持27种编程语言,通吃C,C ,Java ,C#, XM…...
005+limou+HTML——(5)HTML图片和HTML超链接
1、图片标签<img> (1)图片标签属性 [src]:用于指定这个图片所在的路径,常使用相对路径,比较少使用绝对路劲。如果图片路径有错误的话,就会发生图片显示错误[alt]:用于指定图片的提示文字…...
ES6 Generator
Generator Generator是es6引入的,主要用于异步编程。 最大特点是可以交出函数的执行权(即暂停执行)。 它和普通的函数写法有点不同 function关键字与函数名之间有一个*号,以与普通函数进行区别。 它不同于普通函数,是可以暂停执行的。 Gen…...
【AI Agent招聘效能跃迁计划】:为什么92%的HR团队在第3周就放弃?——附可立即上线的MVP验证模板
更多请点击: https://intelliparadigm.com 第一章:AI Agent招聘效能跃迁计划的战略定位与行业悖论 在人才竞争白热化的当下,AI Agent并非招聘流程的“自动化补丁”,而是重构人岗匹配底层逻辑的战略支点。其核心价值不在于替代HR执…...
显卡驱动彻底清理解决方案:Display Driver Uninstaller专业使用指南
显卡驱动彻底清理解决方案:Display Driver Uninstaller专业使用指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers…...
BepInEx配置管理器完整指南:一键管理所有游戏模组设置
BepInEx配置管理器完整指南:一键管理所有游戏模组设置 【免费下载链接】BepInEx.ConfigurationManager Plugin configuration manager for BepInEx 项目地址: https://gitcode.com/gh_mirrors/be/BepInEx.ConfigurationManager 你是否厌倦了为每个游戏模组单…...
解决华硕灵耀X双屏Linux下扬声器不工作的问题
解决华硕灵耀X双屏Linux下扬声器不工作的问题系统信息解决方法0. 备份系统1. 修改内核启动参数,使用HDA驱动2. 测试修复方案3. 持久化修复方案系统信息 我的电脑是:华硕灵耀X双屏Pro UX5100HM 电脑声卡为:ALC294 操作系统为:Manj…...
告别野指针和内存泄漏:用Cppcheck给你的C/C++项目做个免费‘体检’(附VS项目集成教程)
用Cppcheck为C/C项目构建自动化代码质量防护网 在软件开发领域,代码质量直接影响着产品的稳定性和安全性。对于C/C这类系统级语言来说,内存泄漏、野指针等问题往往潜伏在代码深处,直到运行时才突然爆发。而静态代码分析工具就像一位经验丰富的…...
洛雪音乐音源:打破音乐平台壁垒的聚合解决方案
洛雪音乐音源:打破音乐平台壁垒的聚合解决方案 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 你是否曾经为了听一首歌而在多个音乐平台之间来回切换?或者因为某个平台没有…...
2026电工杯数学建模竞赛B题思路分享
大家好呀,2026年电工杯数学建模竞赛今天早晨开赛啦,在这里先带来初步的选题建议及思路。 目前团队正在写B题完整论文,后续还会持续更新哈,大家三连关注一下防止迷路。以下只是简略的图文版初步思路,更详细的视频版完整…...
Adobe-GenP 3.0:为什么这款免费激活工具能让Adobe全家桶瞬间解锁?
Adobe-GenP 3.0:为什么这款免费激活工具能让Adobe全家桶瞬间解锁? 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 你是否曾经因为Adobe Crea…...
华为员工职业发展手册
导读:这份华为员工职业发展手册,围绕员工入职、成长、晋升与激励构建了完整的职业发展体系,核心是明确企业、管理者与员工三方责任,搭建多元发展通道,助力员工与企业共成长。关注公众号:【互联互通社区】&a…...
基于VSCode与CMake的G32R501 MCU现代化开发环境搭建实战
1. 项目概述:为什么选择这套组合拳? 最近在折腾极海半导体的G32R501这款MCU,发现身边不少朋友在搭建开发环境时,要么被臃肿的IDE拖慢速度,要么在构建配置上反复踩坑。我自己的习惯是,能用轻量化工具链搞定的…...
