【java】HashMap的实现原理
目录
- 1. 说明
- 2. 哈希函数
- 3. 桶数组
- 4. 哈希冲突解决
- 5. 动态扩容
- 6. 查找、插入和删除操作
1. 说明
- 1.HashMap是一个基于哈希表的数据结构,它实现了Map接口。
- 2.HashMap允许使用null键和null值,并且不保证映射的顺序。
2. 哈希函数
- 1.HashMap使用哈希函数来计算键的哈希值。
- 2.在Java中,这通常是通过调用键对象的hashCode()方法来实现的。
- 3.hashCode()方法返回一个int类型的哈希码,HashMap使用这个哈希码来确定键在内部数组(也称为“桶”数组)中的位置。
3. 桶数组
- 1.HashMap内部维护了一个Entry数组(或称为“桶”数组),用于存储键值对。
- 2.每个Entry对象包含一个键、一个值以及指向下一个Entry的引用(用于处理哈希冲突时的链表结构)。
4. 哈希冲突解决
- 1.当两个或多个键的哈希值相同时,它们会映射到桶数组中的同一个位置,这称为哈希冲突。
- 2.HashMap通过链表(在Java 8之前)或链表+红黑树(在Java 8及之后)来解决哈希冲突。
- 3.链表:在Java 8之前,当发生哈希冲突时,新的键值对会被添加到冲突位置上的链表的末尾。
- 4.链表+红黑树:在Java 8及之后,为了优化性能,当链表长度超过一定阈值(默认为8)时,链表会转化为红黑树。
- 5.红黑树是一种自平衡的二叉搜索树,它可以在O(log n)的时间内完成查找、插入和删除操作,这比链表的O(n)时间复杂度要好得多。
5. 动态扩容
- 1.HashMap具有动态扩容的能力。
- 2.当桶数组中的元素数量超过负载因子(默认为0.75)与数组长度的乘积时,HashMap会进行扩容操作。
- 3.扩容操作会将数组的长度扩大为原来的两倍(但数组的大小始终是2的幂次方),并重新计算每个键值对在新数组中的位置,然后将它们移动到新数组中。
- 4.扩容操作是一个相对耗时的过程,因为它需要遍历整个HashMap并重新计算每个键值对的位置。
- 5.通过动态扩容,HashMap可以保持较高的查找、插入和删除效率,避免因为数组过满而导致的性能下降。
6. 查找、插入和删除操作
- 1.查找:根据键的哈希值找到对应的桶,然后遍历桶中的链表或红黑树来找到具体的键值对。
- 2.插入:将键值对封装到Entry对象中,根据键的哈希值找到对应的桶,然后处理哈希冲突(添加到链表末尾或红黑树中)。如果链表长度超过阈值,则进行树化操作。如果元素数量超过阈值,则进行扩容操作。
- 3.删除:根据键的哈希值找到对应的桶,然后遍历桶中的链表或红黑树来找到要删除的键值对,并将其从链表或红黑树中移除。如果删除后链表长度小于树化阈值的一半(默认为4),则可能将红黑树转化为链表。
相关文章:
【java】HashMap的实现原理
目录 1. 说明2. 哈希函数3. 桶数组4. 哈希冲突解决5. 动态扩容6. 查找、插入和删除操作 1. 说明 1.HashMap是一个基于哈希表的数据结构,它实现了Map接口。2.HashMap允许使用null键和null值,并且不保证映射的顺序。 2. 哈希函数 1.HashMap使用哈希函数…...
FCM32F103C8T6开发指引
打了块板,没有STM芯片了,于是,换了块FCM32F103C8T6.原来的工程直接编译,不能仿真,提示M3,M4核不兼容,但是,用jflash是可以直接把bin文件烧录进去的,也可以正常运行起来。 但为了方便…...
Python世界:人生苦短,我用Python
Python世界:人生苦短,我用Python 前言Python优势Python缺点 前言 几句话说清,我们为啥要用Python? Python设计之初心,是为了解决编程门槛,让大家更聚焦业务实现,而非编程细节。当前人工智能火…...
【从零开始入门unity游戏开发之——C#篇43】C#补充知识——值类型和引用类型汇总补充、变量的生命周期与性能优化、值类型和引用类型组合使用
文章目录 一、值类型和引用类型汇总补充1、值类型和引用类型汇总2、值类型和引用类型的区别3、简单的判断值类型和引用类型 二、变量的生命周期与性能优化1、**栈和堆的区别**2、**变量生命周期**3、**垃圾回收(GC)机制**4、**代码示例与优化**4.1. 临时…...
从论文到实践:Stable Diffusion模型一键生成高质量AI绘画
🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年12月24日10点02分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文源地址有视频: 链接h…...
项目管理:用甘特图 “导航” 项目全程
项目全程管理是一个复杂而又系统的过程,它涵盖了从项目启动到结束的各个阶段,包括规划、执行、监控和收尾等一系列活动。 项目全程管理能够确保项目按时交付、控制成本、提高质量以及满足客户需求。通过有效的管理,项目团队可以避免资源浪费…...
v3.0.8- 「S+会员」新增专属运动秀,试试新穿搭吧- 与「好友」
v3.0.8 - 「S会员」新增专属运动秀,试试新穿搭吧 - 与「好友」互动支持前往对方所在的「在线运动房」 - 「运动秀工坊」新增智能背景抠图 - 「体育竞技」匹配中可以看到我和对手的装备 - 多项界面体验和性能优化 v2.0.17 - 班级运动场新增运动秀展示 - 班级玩法&…...
9-Gin 中自定义 Model --[Gin 框架入门精讲与实战案例]
在 Gin 框架中自定义 Model 通常指的是定义你自己的数据结构,这些结构体(Structs)将用来表示数据库中的表、API 请求的参数或响应的数据格式。下面是如何在 Gin 中创建和使用自定义 Model 的基本步骤。 自定义 Model 定义结构体 首先&…...
【VBA】EXCEL - VBA 创建 Sheet 表的 6 种方法,以及注意事项
目录 1. 创建一个新工作表,并将其添加到工作簿的末尾 2. 创建一个新工作表,并命名它 3. 创建一个新工作表,并将其插入到指定位置 4. 检查是否已有同名工作表,避免重复创建 5. 创建多个工作表 6. 基于现有模板创建新工作表 …...
数据库中,group by 和partition by:数据分组和数据分区的区别
数据库中,group by 和partition by:数据分组和数据分区的区别 在大规模数据处理和分析的场景中,对数据进行分区和分组处理是非常常见的场景。 为了实现这一操作,在一些主流的关系型数据库管理系统中,提供了group by 和…...
【linux学习指南】Ext系列文件系统(四)路径分区链接
文章目录 🌠⽬录与⽂件名🌠路径解析🌠路径缓存🌠挂载分区🌉 ⽂件系统总结 🌠软硬连接🌉 硬链接🌉 软链接🌉 软硬连接对⽐🌉软硬连接的⽤途: &…...
深度学习中的参数初始化
深度学习中的参数初始化主要是指初始化神经网络中的权重和偏置。权重和偏置通常分开初始化,偏置通常初始化为零或较小的常数值。 没有一种万能的初始化技术,因为最佳初始化可能因具体架构和要解决的问题而异。因此,尝试不同的初始化技术以了解…...
wpf 基于Behavior库 的行为模块
Microsoft.Xaml.Behaviors 是一个用于WPF(Windows Presentation Foundation)的行为库,它的主要作用是允许开发者在不修改控件源代码的情况下,为控件添加自定义的行为和交互逻辑。行为库的核心思想是通过定义可重用的行为组件&…...
【每日学点鸿蒙知识】导入cardEmulation、自定义装饰器、CallState状态码顺序、kv配置、签名文件配置
1、HarmonyOS 无法导入cardEmulation? 在工程entry mudule里的index.ets文件里导入cardEmulation失败 可以按照下面方式添加SystemCapability;在src/main/syscap.json(此文件需要手动创建)中添加如下内容 {"devices": {"gen…...
【SpringMVC】REST 风格
REST(Representational State Transfer,表现形式状态转换)是一种访问网络资源的格式。传统的资源描述方式通常如下: http://localhost/user/getById?id1http://localhost/user/saveUser 而 REST 风格的描述则更简洁:…...
IDEA修改编译版本
目录 一、序言 二、修改maven配置 1.修改 2.代码 三、pom文件配置 1.修改 2.代码 3.问题 一、序言 有两种方法可以帮助大家解决IDEA每次刷新maven的pom配置时,会发生发行源版本不正常的报错。个人推荐第二种,原因:第二种你刷新maven后…...
SkyWalking Agent 配置 Spring Cloud Gateway 插件解决日志错误
SkyWalking Agent 配置 Spring Cloud Gateway 插件解决日志错误 IDEA中启动网管时,需要配置VM启动参数,格式如下: # 配置 SkyWalking Agent 启动参数,以便将网关服务的性能数据上报到 SkyWalking 服务器。 -javaagent:/path/to/sk…...
canvas+fabric实现时间刻度尺(一)
前言 需求:显示一个时间刻度尺,鼠标移动会显示当前时间 技术:我们采用canvasfabric进行实现 效果 实现 1.创建canvas(设置宽高)设为全局变量 2.引入fabric包 3.画时间刻度尺(长方形横线) …...
傲雷亮相2024中国时尚体育季(珠海站),展现户外移动照明风采
2024年12月28-29日,2024中国时尚体育季(珠海站)国家级轮滑比赛在珠海金山体育公园成功举办。作为户外创新型移动照明领域的领导品牌,傲雷受邀参加了本次珠海金湾运动生活嘉年华的展览单元,与众多户外运动品牌同台展示。…...
YOLOv10-1.1部分代码阅读笔记-block.py
block.py ultralytics\nn\modules\block.py 目录 block.py 1.所需的库和模块 2.class DFL(nn.Module): 3.class Proto(nn.Module): 4.class HGStem(nn.Module): 5.class HGBlock(nn.Module): 6.class SPP(nn.Module): 7.class SPPF(nn.Module): 8.class C1(nn…...
R3nzSkin国服特供版:免费体验英雄联盟全皮肤终极指南
R3nzSkin国服特供版:免费体验英雄联盟全皮肤终极指南 【免费下载链接】R3nzSkin-For-China-Server Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin-For-China-Server 还在为英雄联盟皮肤价格昂贵而烦恼吗&…...
在华为欧拉openEuler 22.03 SP2上搞定Oracle 11g R2:一个踩坑无数的可视化安装实录
在华为欧拉openEuler 22.03 SP2上搞定Oracle 11g R2:一个踩坑无数的可视化安装实录 当国产操作系统遇上传统商业数据库,这场跨越技术栈的"联姻"注定充满挑战。作为在openEuler 22.03 SP2上成功部署Oracle 11g R2的实践者,我将以时间…...
AArch64架构TLB管理机制与优化实践
1. AArch64 TLB管理机制概述TLB(Translation Lookaside Buffer)是现代处理器内存管理单元(MMU)的核心组件,负责缓存虚拟地址到物理地址的转换结果。在AArch64架构中,TLB管理机制尤为复杂,涉及多…...
从光猫到路由器:DHCP、PPPoE、静态IP三种连接方式的底层原理与实战抓包分析
从光猫到路由器:DHCP、PPPoE、静态IP三种连接方式的底层原理与实战抓包分析 当你面对家庭或企业网络配置时,是否曾疑惑过为什么不同的网络环境会采用截然不同的连接方式?本文将带你深入三种主流上网方式的技术本质,通过Wireshark抓…...
忆阻器混沌电路设计与储层计算应用
1. 忆阻器混沌电路的设计原理与实现1.1 忆阻器的非线性特性基础忆阻器(Memristor)作为第四种基本电路元件,其核心特性在于电阻值会随通过它的电荷量历史而变化。这种"记忆"特性来源于器件内部导电细丝的形成与断裂过程。在Pt/HfO2/…...
麦当劳中国启动2026全国招聘周招募新生代人才
美通社消息:麦当劳中国正式启动2026年全国招聘周。今年,首批年满16周岁的10后将步入职场,与00后共同构成新生代主力军。在AI的变革时代,麦当劳以"有保障、有福利、有发展"的薪酬福利成长体系,以及长期、系统…...
不懂PMP的项目经理,正在被AI和敏捷时代淘汰
一、一个正在发生的残酷事实 张伟是一家传统制造企业的项目经理,拥有十年工作经验。他的日常工作是这样的:每天早上整理Excel进度表,中午开会协调资源,晚上更新甘特图,睡前发送项目周报。他觉得自己很忙、很重要。 直到…...
推荐五家SF6在线监测报警系统
在有六氟化硫气体存在的场所,如小区配电室、变电站、电厂等,SF6在线监测报警系统起着至关重要的作用。它能实时监测现场气体浓度,在浓度超标时第一时间发出报警信号,及时消除隐患。今天就为大家推荐五家SF6在线监测报警系统品牌&a…...
从点击到意图:鸿蒙 App 的 AI 进化
子玥酱 (掘金 / 知乎 / CSDN / 简书 同名) 大家好,我是 子玥酱,一名长期深耕在一线的前端程序媛 👩💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚…...
REX-C410温控仪连接K型热电偶相关参数设置
1、同时按SET<键3秒 并按SET切换 修改后按 SET键3秒 保存 改SL1 参数为000 K型热电偶 改SL4 参数为0011 过程上限报警 2、按 SET键3秒 改AL1 为SV设定温度值这样修改后当实际温度 小于SV 设定温度值时OUT有输出,当温度达到设定值时ALM1有输出...
