JDK常用的数据类型【1】 ——HashMap(分享篇)

news2025/2/9 9:06:30

在这里插入图片描述

x mod 2^n = x & (2^n - 1)

1. 拿到 key 的 hashCode 值
2. 将 hashCode 的高位参与运算,重新计算 hash 值
3. 将计算出来的 hash 值与 (table.length - 1) 进行 & 运算

数据结构

1.B树 和 B+树

  • B树叶子节点可以存放多个元素
  • B+树的叶子节点之间是有指针的

红黑树

  1. (1) 每个节点或者是黑色,或者是红色。
  2. (2) 根节点是黑色。
  3. (3) 每个叶子节点是黑色。 [注意:这里叶子节点,是指为空的叶子节点!]
  4. (4) 如果一个节点是红色的,则它的子节点必须是黑色的。
  5. (5) 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

HashMap 的底层是个 Node 数组(Node<K,V>[]
table),在数组的具体索引位置,如果存在多个节点,则可能是以链表或红黑树的形式存在。

增加、删除、查找键值对时,定位到哈希桶数组的位置是很关键的一步,源码中是通过下面3个操作来完成这一步:

  • 1)拿到 key 的 hashCode 值;
  • 2)将 hashCode 的高位参与运算,重新计算 hash 值;
  • 3)将计算出来的
    hash 值与 “table.length - 1” 进行 & 运算。
  • HashMap 的默认初始容量(capacity)是 16,capacity 必须为 2 的幂次方;默认负载因子(load factor)是 0.75;实际能存放的节点个数(threshold,即触发扩容的阈值)= capacity * load factor。

HashMap 在触发扩容后,阈值会变为原来的 2 倍,并且会对所有节点进行重 hash 分布,重 hash
分布后节点的新分布位置只可能有两个:“原索引位置” 或 “原索引+oldCap位置”。例如 capacity 为16,索引位置 5
的节点扩容后,只可能分布在新表 “索引位置5” 和 “索引位置21(5+16)”。

导致 HashMap 扩容后,同一个索引位置的节点重 hash 最多分布在两个位置的根本原因是:
1)table的长度始终为 2 的 n 次方;
2)索引位置的计算方法为 “(table.length - 1) & hash”。HashMap 扩容是一个比较耗时的操作,定义HashMap 时尽量给个接近的初始容量值。

  • HashMap 有 threshold 属性和 loadFactor 属性,但是没有 capacity 属性。初始化时,如果传了初始化容量值,该值是存在 threshold 变量,并且 Node 数组是在第一次 put
    时才会进行初始化,初始化时会将此时的 threshold 值作为新表的 capacity 值,然后用 capacity 和loadFactor 计算新表的真正 threshold 值。
  • 当同一个索引位置的节点在增加后达到 9 个时,并且此时数组的长度大于等于 64,则会触发链表节点(Node)转红黑树节点(TreeNode),转成红黑树节点后,其实链表的结构还存在,通过 next属性维持。链表节点转红黑树节点的具体方法为源码中的 treeifyBin方法。而如果数组长度小于64,则不会触发链表转红黑树,而是会进行扩容。
  • 当同一个索引位置的节点在移除后达到 6 个时,并且该索引位置的节点为红黑树节点,会触发红黑树节点转链表节点。红黑树节点转链表节点的具体方法为源码中的 untreeify 方法。
  • HashMap 在 JDK 1.8 之后不再有死循环的问题,JDK 1.8 之前存在死循环的根本原因是在扩容后同一索引位置的节点顺序会反掉。
  • HashMap 是非线程安全的,在并发场景下使用 ConcurrentHashMap 来代替。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全|渗透测试入门学习,从零基础入门到精通—收集信息篇

目录 前面的话 1、收集域名信息 1.1、Whois查询 ​编辑1.2、备案信息查询 2、收集敏感信息 3、收集子域名信息 3.1、子域名检测工具 3.2、搜索引擎枚举 3.3、第三方聚合应用枚举 3.4、证书透明度公开日志枚举 本章小结 前面的话 本人喜欢网络完全的一些知识&#xff…

老油条辞职信写好了,00后卷王的自述,我难道真的很卷?

前言 前段时间去面试了一个公司&#xff0c;成功拿到了offer&#xff0c;薪资也从12k涨到了18k&#xff0c;对于工作都还没两年的我来说&#xff0c;还是比较满意的&#xff0c;毕竟一些工作3、4年的可能还没我高。 我可能就是大家说的卷王&#xff0c;感觉自己年轻&#xff0…

出现报错Invalid bound statement (not found): xxx.xxxMapper.方法名 时的几种异常排除方法

报错信息&#xff1a;Invalid bound statement (not found): com.ruoyi.enterpriseman.trade.mapper.TradeEnterpriseMapper.selectTradeEnterpriseList 1.mapper.xml中的namespace和实际的mapper文件不一致 这个问题其实很好解决&#xff0c;瞪大眼睛&#xff0c;仔仔细细看看…

[SSM]Maven详解

目录 Maven 自动化构建工具 Maven简介 Maven的核心概念 maven约定的目录结构 仓库 POM文件 生命周期、命令、插件 Maven在IDEA中的应用 IDEA集成maven IDEA创建Maven版java工程 IDEA创建Maven版web工程 IDEA中导入Maven工程&#xff08;module&#xff09; 依赖管理…

Windows 离线安装mysql5.7

一、下载MySQL5.7最新版 1、官网地址 https://downloads.mysql.com/archives/community/ 2、下载MySQL5.7最新版 下载下图所示的安装包&#xff1a; 二、安装MySQL5.7 1、解压 将刚才下载压缩包解压搭配目录C:\software\mysql-5.7.41&#xff0c;&#xff08;路径大家可…

背完这195道软件测试面试题,帮你轻松拿下提前批offer

前言&#xff1a; 最近在整理字节&#xff0c;阿里&#xff0c;腾讯&#xff0c;京东的面试题&#xff0c;挑了一部分在四个大厂面试题中出现频率比较高的&#xff0c;发现还是基础知识比较多&#xff0c;废话不多说&#xff0c;你们自己看看&#xff0c;这里小编只放了面试题&…

电动超声波硅胶洁面仪单片机开发方案

近来&#xff0c;网红超声波洁面仪受到人们喜爱&#xff0c;特别是爱化妆的女性朋友&#xff0c;常用来清洁脸部肌肤。在本方案中&#xff0c;洁面仪IC采用宇凡微YF单片机&#xff0c;我们提供多种洁面仪方案&#xff0c;根据不同功能需求有多个洁面仪芯片可供选择。 一、超声波…

价值5k的软件测试企业级实战项目,只为了回答你软件测试如何学!

学习软件测试如何学&#xff0c;在回答这个问题之前&#xff0c;我先分析下&#xff0c;在企业中做项目整个测试流程是什么样的&#xff0c;你清楚了整个企业的测试流程&#xff0c;就会清楚企业做测试需要什么&#xff1f;从而也就会明白如何去学测试。 1、需求&#xff1a; …

JDBC --- Java的数据库编程

目录 &#x1f348;一、数据库编程的必备条件 &#x1f349;二、什么是 JDBC JDBC 的优势 &#x1f34a;三、JDBC 使用流程 以及 常用接口和类的讲解 &#x1f361;0. 前置工作 &#x1f36d;1. 引入依赖 &#x1f36c;2. 数据库连接Connection &#x1f36c;3. 创建操…

11-基于51单片机电子密码锁门禁(实物图+原理图+源程序+仿真+论文)全套资料

编号: 011 本系统采用 51单片机 24C02芯片矩阵键盘 继电器 开锁指示灯 LCD1602液晶 蜂鸣器 而成 1.单片机型号:STC89C52/51、AT89C52/51、AT89S52/51可以任选。程序通用 2.采用矩阵按键输入、1602液晶显示、继电器模拟开锁、发光二极管为开锁指示灯&#xff0c;继电器是可以外…

适配器模式(九)

不管怎么样&#xff0c;都要继续充满着希望 上一章简单介绍了建造者模式(八), 如果没有看过, 请观看上一章 一. 适配器模式 引用 菜鸟教程里面的 适配器模式介绍: https://www.runoob.com/design-pattern/adapter-pattern.html 适配器模式&#xff08;Adapter Pattern&#…

出海品牌直播带货:虚拟主播的优势与挑战,以及未来趋势揭秘

随着全球化的发展和网络技术的进步&#xff0c;海外直播带货成为了品牌拓展海外市场的一种新方式。而在这个数字化时代&#xff0c;虚拟主播的出现给海外直播带货带来了全新的可能性。 在传统直播带货中&#xff0c;品牌需要派遣代表或明星代言人亲自现场演示产品&#xff0c;…

15、Nginx---slice模块,大文件分片请求

Nginx的slice模块可以将一个请求分解成多个子请求&#xff0c;每个子请求返回响应内容的一个片段&#xff0c;让大文件的缓存更有效率。。 HTTP Range请求&#xff1a; HTTP客户端下载文件时&#xff0c;如果发生了网络中断&#xff0c;必须重新向服务器发起HTTP请求&#xff0…

2023年网络安全专业的前景怎么样?

网络安全与我们每一个人都息息相关&#xff0c;无论是企业还是个人&#xff0c;现在都非常重视网络安全。而且网络安全是一个新兴的行业&#xff0c;人才需求量远远大于供给&#xff0c;所以在薪资福利上具有很大的优势&#xff0c;并且对于初学者而言&#xff0c;很多人依旧担…

【JVM系列】GC算法介绍

文章目录 概述对象存活判断垃圾收集算法标记 -清除算法复制算法标记-整理算法分代收集算法 概述 垃圾收集 Garbage Collection 通常被称为“GC”&#xff0c;它诞生于1960年 MIT 的 Lisp 语言&#xff0c;经过半个多世纪&#xff0c;目前已经十分成熟了。 jvm 中&#xff0c;程…

企业操作手册有必要弄成在线版本吗?

企业操作手册是对企业运营的各个环节进行详细记录、说明和规范化&#xff0c;以指导企业各类人员在工作中的行为、方法和流程。 下面是编写企业操作手册的基本步骤&#xff1a; 1.明确编写内容。制定编写计划&#xff0c;明确需要编写哪些方面的操作手册和具体内容&#xff0…

抗战时期的15W电台竟能传送到千里之外?

我们大部分人应该都看过谍战影视剧&#xff0c;在剧中不管是敌方、友方还是我方&#xff0c;要想传递情报&#xff0c;基本都是通过无线电台进行联络的。而一旦离开无线电台&#xff0c;谍报人员之间的联络沟通就会变得十分困难。 在电影《永不消逝的电波》中&#xff0c;我们…

Hyper-V管理器无法连接到服务器,Hyper-V主机计算服务无法打开,vmcompute.exe应用程序无法正常启动(0xc0000606)的一种解决方法

Hyper-V无法连接到服务器&#xff0c;发现Hyper-V主机计算服务打不开&#xff0c;然后找到“C:\WINDOWS\System32\vmcompute.exe”&#xff0c;双击报错0xc0000606&#xff0c;用Microsoft 错误查找工具找到是程序不支持“控制流保护&#xff08;CFG&#xff09;”&#xff0c;…

vr消防隐患排查软件应用到加油站的好处

传统的隐患辨识排查安全培训方式主要以理论培训为主&#xff0c;现有的实操培训力量较弱且加油站涉及危险环境现有的实操培训难以满足实际需求&#xff0c;如何高效进行加油站安全隐患辨识与排查? 加油站火灾VR安全隐患排查系统是一种基于VR虚拟现实技制作术的智能化安全检查工…

Jmeter自定义函数二次开发

目录 前言&#xff1a; 开发步骤&#xff1a; 前言&#xff1a; JMeter自定义函数是一种使用Java编写的函数&#xff0c;它可以与JMeter脚本一起使用。如果JMeter原始函数不满足您的需求&#xff0c;您可以使用Java编写自定义函数来扩展其功能。 需求&#xff1a;读取本地存…