当前位置: 首页 > news >正文

HashMap底层原理

文章目录

  • 1. 基本概念
  • 2. HashMap 的底层数据结构
  • 3. HashMap 的 put 方法流程
  • 4. 怎么计算节点存储的下标
  • 5. Hash 冲突
    • 1)概念
    • 2)解决 hash 冲突的办法
      • 开放地址法
      • 再哈希法
      • 链地址法
      • 建立公共溢出区
  • 6. HashMap 的扩容机制
    • 1)扩容时涉及到的几个属性
    • 2)扩容的条件
    • 3)扩容的简要流程


1. 基本概念

HashMap 是基于 Map 接口实现的一个存储键值对数据的集合

最多允许一个为 null 的 key 值,且 HashMap 存储的数据是无序的

2. HashMap 的底层数据结构

HashMap 底层是由 数组 + 链表 / 红黑树 组成,当链表过长,会影响 HashMap 的性能,链表就会转变成红黑树,数组是 HashMap 的主体,数组中存储链表或红黑树的头节点

链表转换成红黑树的前提条件:

  • 当链表长度超过 8 并且数组长度超过 64 才会转换成红黑树
  • 链表转变为红黑树之前会进行判断,如果数组长度小于 64,那么会继续对数组扩容,而不是转变成红黑树

3. HashMap 的 put 方法流程

简要流程如下:

  1. 判断数组是否为空,是空就调用 resize 对数组初始化

  2. 根据 key 值计算 hash 值,得到该节点对在数组中存储的下标

  3. 如果没发生哈希冲突将该节点直接存入对应的数组下标处

  4. 冲突后先判断当前 Map 中 key 值是否存在,如果存在直接替换当前 Map 中 key 对应的 value

  5. 如果 key 值不存在且冲突节点处是红黑树,直接将该节点存入树上

  6. 如果 key 值不存在且冲突节点处是链表:

    • 判断链表长度是否大于 8
    • 小于 8 直接存入链表,
    • 如果大于 8,就判断数组长度是否大于 64,大于 64 链表转换成红黑树,将该节点存入树上;小于 64 先对数组进行扩容,再重新计算 hash 值进行存储

请添加图片描述

4. 怎么计算节点存储的下标

先通过源码看一下 JDK 8 中是如何计算 hash 值的

请添加图片描述

  1. 先判断 key 值是否为 null,为 null 直接返回 0
  2. 如果不为 null,先调用 hashCode 方法得到 hashCode
  3. 将得到的 hashCode 按位右移 16 位,再与原来的 hashCode 进行异或操作得到 hash 值

计算下标:

通过 HashMap 存储节点的源码可以看出,HashMap 将节点存储在 (table.length - 1) & hash 下标处

即节点下标是数组长度减一再按位与 hash 值得到的

请添加图片描述

5. Hash 冲突

1)概念

hash 冲突是指,通过 hash 函数得到的存放节点的地址已经被占用了

2)解决 hash 冲突的办法

解决 hash 冲突的方法有:开放定址法、再哈希法、链地址法、建立公共溢出法。HashMap 中采用的是 链地址法

开放地址法

如果出现了冲突,就以上次得到的 hash 值再次进行运算得到一个新的 hash 值,直到找到一个没有冲突的 hash 值

再哈希法

提供多个不同的 hash 函数,如果发生了冲突,就用其他 hash 函数计算 hash 值,直到一个没有冲突的 hash 值

链地址法

将 hash 值相同的元素构成一个单链表,并将单链表的头指针存入哈希表中。此方法就是 HashMap 的底层数据结构,数组加链表的形式

建立公共溢出区

将哈希表分为公共表和溢出表,凡是发生冲突的数据统一放在溢出区

6. HashMap 的扩容机制

1)扩容时涉及到的几个属性

  1. capacity :容量,默认 16
  2. loadFactor:负载因子,默认是 0.75
  3. threshold:阈值,阈值 = 容量 * 负载因子,默认是 12

2)扩容的条件

  1. 链表长度大于 8,数组长度小于 64
  2. HashMap 中的元素个数大于阈值

3)扩容的简要流程

创建一个容量更大的数组,一般为原来数组的两倍,将原来数组的元素拷贝到新的数组中,扩容完成之后,阈值也变为原来的两倍

相关文章:

HashMap底层原理

文章目录1. 基本概念2. HashMap 的底层数据结构3. HashMap 的 put 方法流程4. 怎么计算节点存储的下标5. Hash 冲突1)概念2)解决 hash 冲突的办法开放地址法再哈希法链地址法建立公共溢出区6. HashMap 的扩容机制1)扩容时涉及到的几个属性2&a…...

卡顿优化小结

卡顿的本质 卡顿的本质是因为一次垂直同步信号来的时候,当前帧要显示的图像数据还没准备好,只能等待16ms下一次垂直同步信号来时才能更新画面,在这段时间里显示器只能一直停留在上一帧的画面,如果跳过的帧数过多,就会…...

springboot前端ajax 04 关于后台传的时间和状态在前端的转换

修改状态及时间格式 在jsp中&#xff0c;时间显式&#xff1a; 只需要把json的时间部分改为用Date对象来显示就好了。 <td>new Date(jsonObj[i].startTime).toLocaleString()</td> <td>new Date(jsonObj[i].endTime).toLocaleString()</td> 状态对象…...

解决Windows微信和 PowerToys 的键盘管理器冲突

Windows开机之后PowerToys能正常使用, 但是打开微信之后设置好的快捷键映射就全部失效了 打开微信 -> 左下角三条杠 -> 设置 -> 快捷键 首先我把微信的快捷键全部清空了,发现还是没用 然后发现了设置里默认勾选了检测快捷键,我在想程序肯定是一直在后台检测,而powerTo…...

组会时间的工作

1. 党支部活动 看看组织生活记录本写完了没有 2. 论文翻译...

linux udp bind 返回值-1分析

在linux socket通信中,我们通常用到open/bind/read/write等内部函数,那么当这些函数返回值为-1的时候,我们怎么进一步定位呢! (1)怎么打印出返回值出错的原因呢!系统调用的错误都会存放在errno中 errno需要的头文件: #include<errno.h> strerror头文件,将错误信…...

Hexo搭建博客

文章目录开始安装使用配置主题配置gitee配置域名之前配置过hexo但是后来hexo文件夹莫名其妙崩了&#xff0c;我也懒得修理&#xff0c;就没管了&#xff0c;现在又想重拾回来。然后hexo可以搭建静态博客网站&#xff0c;放在github或者gitee都行&#xff0c;有免费的网页空间&a…...

Lesson11:http协议

前言 应用层:就是程序员基于socket接口之上编写的具体逻辑,做了很多工作,都是和文本处理有关的--- 协议分析与处理http协议,一定会具有大量的文体分析和协议处理如果用户想再url中包含url本身用来作为特殊字符的字符,url形式的时候,浏览器会自动给我们进行编码encode一般服务端…...

计算机信息安全有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是计算机信息安全方向的SCI期刊推荐&#xff1a; IEEE Transactions on Information Forensics and Security 该期刊主要发表信息安全和数字取证方面的原创性研究&#xff0c;包括数据安全、网络安全、身份认证、加密、信息隐藏等领域的研究成果。该期刊的影响因子为8.134…...

CNVD-2023-12632 泛微e-cology9 sql注入 附poc

目录 漏洞描述影响版本漏洞复现漏洞修复 漏洞描述 泛微 E-Cology9 协同办公系统是一套基于 JSP 及 SQL Server 数据库的 OA 系统&#xff0c;包括知识文档管理、人力资源管理、客户关系管理、项目管理、财务管理、工作流程管理、数据中心等打造协同高效的企业管理环境&#…...

赛宁网安合作伙伴大会成功举办,重磅发布SCBaaS服务!

​​3月29日&#xff0c;“赛宁网安合作伙伴大会”在江苏南京隆重举办。大会现场汇集网络安全数字化领域的专业人才、技术专家&#xff0c;共同研讨数字安全发展趋势&#xff0c;分享智能安全解决方案和技术创新产品。 会上&#xff0c;赛宁网安产品专家针对数字化靶场、网络安…...

R语言 4.2.2安装包下载及安装教程

[软件名称]:R语言 4.2.2 [软件大小]: 75.6 MB [安装环境]: Win11/Win10/Win7 [软件安装包下载]: https://pan.quark.cn/s/b6f604930d04 R语言软件的GUI界面比较的简陋,只有一个命令行窗口,且每次创建图片都会跳出一个新的窗口,比较的繁琐,我们可以安装RStudio,来更方便的操作R(…...

快速玩转 CNStack 2.0 流量防护

作者&#xff1a;冠钰 云原生下的服务治理 在云原生技术的演进过程中&#xff0c;依托云原生技术能力&#xff0c;形成一个可以向下管理基础设施&#xff0c;向上管理业务应用的技术中台&#xff0c;越来越成为企业期望的云原生技术落地趋势。随着云原生技术中台 CNStack 发布…...

你还在用原生 poi 处理 excel?太麻烦了来瞧瞧这个

1、easypoi 前言 Excel 在日常工作中经常被用来存储用例信息&#xff0c;是一种非常便捷的数据存储工具有着众多的优点&#xff0c;我们就不一一介绍了。 今天来讲讲 Java 操作 Excel&#xff0c;总所周知 Java 是世界上最好的语言&#xff08;不容反驳&#xff09;&#xff…...

No.027<软考>《(高项)备考大全》【第11章】项目风险管理

【第11章】项目风险管理1 章节相关1.1 考试相关1.2 ITO口诀2 章节概述2.1 风险的含义2.2 风险定义的三个必要条件2.3 项目风险2.4 风险的随机性和相对性2.5 风险的分类2.6 风险成本2.7.1 风险损失有形成本2.7.2 风险损失无形成本2.8 项目风险管理过程3 规划风险管理4 识别风险4…...

mit6.824 lab2c-数据持久化

目录2c简介2b、2a问题测试时间2c简介 简单的说&#xff0c;raft需要将currentTerm、voteFor、entries(当前的所有日志)保存到硬盘进行持久化存储。 保存的方法&#xff1a;在变量改变时&#xff0c;利用persist()中的gob将变量序列化&#xff0c;存储在persister结构体中。&a…...

leaflet使用L.geoJSON加载文件,参数filter的使用方法(127)

第127个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载geojson文件,这里介绍filter的使用方法。filter将用于决定是否包含某个功能的函数。 默认是包括所有特征。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方…...

23年5月高项学习笔记7—— 质量管理

质量通常指产品质量&#xff0c;也包括工作质量&#xff08;即过程&#xff09;&#xff0c;产品质量是指产品的使用价值&#xff0c;工作质量是产品质量的保证&#xff0c;反映了产品质量直接相关的工作的对产品质量的保证程度。 公差&#xff1a;结果的可接受范围 项目合同…...

学编程需要哪些基础呢?一起来看看吧

众所周知程序员薪酬高、工作环境好&#xff0c;是很多人向往的职业&#xff0c;那么学编程需要什么基础&#xff1f;0基础能学编程吗&#xff1f; 学编程需要什么基础&#xff1f; 1、数学基础 从计算机发展和应用的历史来看计算机的数学模型和体系结构等都是有数学家提出的&…...

PECS In Java泛型类型通配符限定之<? extends T>与<? super T>

泛型类型通配符限定 &#x1f686;PECS | 类型通配符限定如何使用“<? extends T>”和“<? super T>”通配符java源码示例PECS | 类型通配符限定 PECS原则是指在使用泛型时&#xff0c;当我们需要传递一个泛型集合时&#xff0c;如何选择适当的泛型类型通配符来…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...