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

分析一下HashMap内部是怎么实现的

当然可以!我们来深入分析一下 Java 中 HashMap 的内部实现机制(以 JDK 8 为主),包括数据结构、核心算法、源码设计、以及适用场景。


🧠 一、HashMap 的核心结构

HashMap 是基于哈希表实现的 Map,底层结构是数组 + 链表 + 红黑树的结合体:

✅ 数据结构

transient Node<K,V>[] table; // 主体数组,哈希桶(bucket)
  • 每个数组元素称为一个“桶”(bucket)。
  • 每个桶可能为空,也可能是:
    • 链表结构:用于解决哈希冲突;
    • 红黑树结构:当链表过长(默认长度 > 8)时转为红黑树,提高查询效率。

🔧 二、HashMap 的核心操作

1️⃣ put(K key, V value) —— 添加元素

主要流程:

  1. 计算 key 的 hash 值并映射到桶

    int hash = hash(key);
    int index = (n - 1) & hash; // 取模操作(位运算优化)
    
  2. 判断是否存在冲突

    • 若该桶为空,直接新建节点放入。
    • 若已存在节点:
      • key 已存在 ⇒ 覆盖旧值;
      • key 不存在 ⇒ 添加到链表尾部或插入红黑树。
  3. 链表长度超过阈值(8)

    • 且数组长度 >= 64 时 ⇒ 转为红黑树
    • 否则还是保持链表。
  4. 是否触发扩容?

    • 若当前元素个数 > threshold(一般为 loadFactor × capacity) ⇒ 触发 resize()

2️⃣ get(Object key) —— 查找元素

  1. 计算 hash ⇒ 定位到桶;
  2. 遍历桶内链表或红黑树,比较 key 是否相等;
  3. 找到即返回 value,未找到返回 null。

3️⃣ resize() —— 扩容机制

  • 扩容一般是原容量的 2 倍
  • 将旧数组的所有元素重新 hash 分配到新数组;
  • 扩容是最消耗性能的操作之一,会导致 O(n) 的开销;
  • 所以建议创建 HashMap 时合理指定初始容量。
int newCap = oldCap << 1;

📦 三、Node 节点结构(源码简化)

static class Node<K,V> implements Map.Entry<K,V> {final int hash;final K key;V value;Node<K,V> next; // 链表结构
}

若该桶变为红黑树,则会变成 TreeNode(继承 Node):

static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {TreeNode<K,V> parent;TreeNode<K,V> left;TreeNode<K,V> right;boolean red;
}

🧠 四、哈希函数和哈希扰动

为了避免哈希冲突,JDK 8 对 hashCode() 结果做了“扰动处理”:

static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

这种处理方式能让高位参与低位运算,提高 hash 值的随机性,从而减少哈希冲突


🚩 五、红黑树的使用条件

条件是否转为红黑树
链表长度 > 8,且数组长度 >= 64✅ 转为红黑树
链表长度 > 8,数组长度 < 64❌ 不转,优先扩容
树节点个数 < 6✅ 转回链表(treeify → untreeify)

这样做的好处是避免在小容量下使用红黑树带来的额外复杂度和性能负担。


📈 六、时间复杂度分析

操作最佳情况最坏情况(大量哈希冲突)
put/get/removeO(1)O(log n)(红黑树)或 O(n)(链表)
resizeO(n)O(n)

📌 七、HashMap 线程安全性

  • 非线程安全!
    • 多线程下容易出现 数据覆盖死循环(JDK 7)、丢失更新等问题。
  • 如果多线程环境:
    • 可使用:Collections.synchronizedMap(new HashMap())
    • 或直接用:ConcurrentHashMap(更高效,分段锁/红黑树优化)

✅ 八、应用场景

适合以下场景:

  • 查找、插入、删除频繁且对性能要求高;
  • Key 无序、无需排序;
  • Key 避免过多 hash 冲突(选择好的 hashCode() 方法);
  • 单线程或开发者自行管理并发问题。

🧪 九、底层源码建议阅读入口(JDK 8)

HashMap.java 的以下方法入手:

  • putVal(...):添加元素的核心逻辑
  • resize():扩容处理
  • treeifyBin(...):链表转红黑树
  • getNode(...):查找逻辑

相关文章:

分析一下HashMap内部是怎么实现的

当然可以&#xff01;我们来深入分析一下 Java 中 HashMap 的内部实现机制&#xff08;以 JDK 8 为主&#xff09;&#xff0c;包括数据结构、核心算法、源码设计、以及适用场景。 &#x1f9e0; 一、HashMap 的核心结构 HashMap 是基于哈希表实现的 Map&#xff0c;底层结构是…...

面向对象的要素

理解面向对象 程序的三种基本结构 &#xff08;1&#xff09;顺序结构 &#xff08;2&#xff09;选择结构 &#xff08;3&#xff09;循环结构 面向对象程序设计简介 面向对象是一种更优秀的程序设计方法&#xff0c;它的基本思想是使用类、对象、继承、封装、消息等基本…...

Java基础 4.9

1.方法递归调用练习 //请使用递归的方式求出斐波那契数1, 1, 2, 3, 5, 8, 13 //给你一个整数n, 求出它的值是多少 /* 思路 n 1 1 n 2 1 n > 3 前两个数的和 递归的思路 */ public class RecursionExercise01 {public static void main(String[] args) {Mathod mathod ne…...

什么是堆?深入理解堆数据结构及其应用

粉丝提问 ⭐算法OJ⭐数据流的中位数【最小堆】Find Median from Data Stream 发表后收到一位粉丝的私信询问&#xff1a; “经常听说堆、堆排序、优先队列这些概念&#xff0c;但一直不太明白堆到底是什么&#xff0c;能简单解释一下吗&#xff1f;它和内存分配中的堆是一回事…...

程序化广告行业(73/89):买卖双方需求痛点及应对策略深度剖析

程序化广告行业&#xff08;73/89&#xff09;&#xff1a;买卖双方需求痛点及应对策略深度剖析 大家好&#xff01;一直以来&#xff0c;我都热衷于在技术领域探索学习&#xff0c;也深知知识的分享能让我们共同进步。写这篇博客的目的&#xff0c;就是希望能和大家一起深入了…...

C++ RAII 的用途及业务代码实现案例

C RAII 的用途及业务代码实现案例 RAII 的核心概念 RAII (Resource Acquisition Is Initialization&#xff0c;资源获取即初始化) 是 C 的核心编程范式&#xff0c;其核心思想是&#xff1a; 资源获取与对象构造绑定资源释放与对象析构绑定利用 C 对象生命周期自动管理资源…...

神经网络入门—自定义神经网络续集

修改网络 神经网络入门—自定义网络-CSDN博客 修改数据集&#xff0c;yx^2 # 生成一些示例数据 x_train torch.tensor([[1.0], [2.0], [3.0], [4.0]], dtypetorch.float32) y_train torch.tensor([[1.0], [4.0], [9.0], [16.0]], dtypetorch.float32) 将预测代码改为&…...

【C语言】浮点数在内存的储存

前言&#xff1a; 在上章&#xff0c;了解了整数在内存中的储存&#xff0c;在本章节为大家继续讲解浮点数的储存&#xff0c;也是数据储存的最后一部分。 浮点数是计算机科学中一种重要的数据类型&#xff0c;用于表示实数。它能够表示非常大或非常小的数值&#xff0c;并且…...

安装 Calico 的两种主流方式对比

本文对比了 Calico 的两种主流安装方式&#xff1a; 使用 calico.yaml 的 Manifest 安装方式使用 Tigera Operator&#xff08;tigera-operator.yaml custom-resources.yaml&#xff09;安装方式 ✅ 1. 使用 Manifest 方式安装&#xff08;直接部署 calico.yaml&#xff09; …...

信用卡欺诈检测实战教程:从数据预处理到模型优化全解析

引言&#xff1a;为什么需要信用卡欺诈检测&#xff1f; 根据尼尔森报告&#xff0c;全球每年因信用卡欺诈造成的损失超过250亿美元&#xff0c;金融机构需要在0.1秒内完成交易风险评估。本文将带您从零构建基于机器学习的信用卡欺诈检测系统&#xff0c;完整代码可视化分析&a…...

android studio编译报错 Gradle

android studio 提示 Could not install Gradle distribution from https://services.gradle.org/distributions/gradle-8.0.2-bin.zip. Reason: java.net.SocketTimeoutException: Read timed out 一&#xff0c;手动下载 https://services.gradle.org/distributions/gradle…...

【Nodebb系列】Nodebb笔记写入方案

NodeBB写入方案 前言 最近在整理以前记录的碎片笔记,想把它们汇总到NodeBB中,方便管理和浏览。但是笔记内容有点多,并且用发帖的形式写到NodeBB中会丢失时间信息,因此整理了一套NodeBB写入方案,大致流程如下: 建立标准笔记格式导出原始笔记,并编写脚本将笔记内容转换为…...

Spring Boot 集成 POI

Spring Boot 集合 POI Apache POI 官站&#xff1a;https://poi.apache.org/ 基础概念 Apache POI 是一个开源项目&#xff0c;提供 Java API 用于操作 Microsoft Office 文件格式。Apache POI 对 Excel 文件的处理分为两个主要类库&#xff1a; HSSF (Horrible Spreadsheet …...

8个方向使用DeepSeek打磨完美课题申报书!

一份出色的课题申报书&#xff0c;往往就是项目获批的关键。撰写高质量课题申报书绝非易事&#xff0c;它需要您在选题切入点、研究价值论证、技术路线设计、团队优势呈现、经费规划和预期成果等多维度进行精心布局&#xff0c;确保论证有力、重点突出、结构清晰。 本文为您提供…...

Leetcode 34.在排序数组中查找元素的第一个和最后一个位置

题目描述 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 考察二…...

ctfshow VIP题目限免 密码逻辑脆弱

根据题目提示&#xff1a;公开的信息比如邮箱&#xff0c;可能造成信息泄露&#xff0c;产生严重后果 在页面上找一个邮箱号 从 QQ 上面搜索这个 QQ号&#xff0c;发现是一个叫大牛的人&#xff0c;地区是陕西西安 然后我们拼接访问 /admin 发现了一个后台登录系统的页面&…...

C++初级入门学习

数据结构初级部分的学习我们已经学完了&#xff0c;接下来就进入C初阶部分的学习&#xff0c;因为数据结构的高阶部分要用到C才能够更好的理解并书写&#xff0c;所以我们要先学习C&#xff0c;初阶部分学完就能继续学习我们对数据结构了。好了&#xff0c;直接进入今天的主题吧…...

2025年汽车加气站操作工证考试内容

汽车加气站操作工证是从事汽车加气站相关操作工作的人员需要考取的资格证书 考试内容 理论知识&#xff1a;包括加气站的工艺流程、设备原理、安全操作规程、气体性质、消防知识、环境保护等方面的知识。例如&#xff0c;需要了解压缩天然气或液化天然气的储存、运输和加注流…...

python爬虫:喜马拉雅案例(破解sign值)

声明&#xff1a; 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff…...

嵌入式AI前沿:精选工具与应用网站解析

1. Edge Impulse 网址&#xff1a;https://www.edgeimpulse.com/核心内容&#xff1a; 提供端到端的嵌入式AI开发平台&#xff0c;简化从数据收集到模型训练再到部署的全流程。支持多模态数据处理&#xff08;音频、视觉、运动等&#xff09;&#xff0c;并优化模型以在资源受…...

【论文精读】Multi-scale Neighbourhood Feature Interaction Network

摘要&#xff08;ABSTRACT&#xff09; 光伏发电是工业领域的关键组成部分&#xff0c;其能量转换效率受光伏电池表面缺陷的显著影响。近年来&#xff0c;深度学习模型的广泛应用推动了缺陷检测技术的进步。然而&#xff0c;由于光伏电池缺陷尺寸差异较大&#xff08;尤其是微…...

C++ 蓝桥云课代码练习

代码一 &#xff0c;小明的背包1&#xff0c;代码见下 #include <iostream> #include <cstring> using namespace std;#define maxn 110 #define maxm 1001 #define inf -1int w[maxn], v[maxn]; int dp[maxn][maxm];int main() {memset(dp, inf, sizeof(dp));dp[…...

微软庆祝它成立整整50周年

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

android 启动四大组件

在 Android 开发中&#xff0c;启动通常是指启动一个 Activity、Service、BroadcastReceiver 或其他组件。以下是一些常见的启动方式&#xff1a; 1. 启动一个 Activity 要启动一个 Activity&#xff0c;可以使用 Intent。以下是一个示例代码&#xff1a; 示例&#xff1a;启…...

C# 串口通信

1. 导入 using System.IO.Ports;2. 初始化定义 SerialPort sp new SerialPort(); // 设置串口 sp.PortName "COM3"; // 串口 sp.BaudRate 9600; // 波特率 sp.Parity Parity.None; // 校验位 sp.DataBits 8; // 数据位 sp.StopBits StopBits.One; // 停…...

Spring事务详解

一、Spring对事务的支持 1.事务概述 什么是事务 在一个业务流程当中&#xff0c;通常需要多条DML&#xff08;insert delete update&#xff09;语句共同联合才能完成&#xff0c;这多条DML语句必须同时成功&#xff0c;或者同时失败&#xff0c;这样才能保证数据的安全。 多…...

单片机FreeRTOSTickless低功耗模式应用示例

Tickless低功耗模式在很多需要延长电池寿命或减少能耗的场景中非常有用&#xff0c;特别是在那些大部分时间处于空闲状态的系统中。 以下是一些使用Tickless模式的场景和例子&#xff1a; 1.传感器节点在物联网&#xff08;IoT&#xff09;中&#xff0c;许多传感器节点需要长…...

2025.4.9总结

今天周三&#xff0c;晚上默认不加班&#xff0c;每到闲暇的时候&#xff0c;总会瞎想。 如今想想&#xff0c;是要多提升提升自身的软实力了。硬实力&#xff0c;是你的专业技能&#xff0c;是你吃饭的东西&#xff0c;而软实力则体现在人际交往&#xff0c;表达能力等方面。…...

Ceph异地数据同步之-Cephfs异地同步复制

#作者&#xff1a;闫乾苓 文章目录 1.核心原理2.部署步骤3.cephfs同步测试4.查看cephfs文件同步状态5.优化cephfs文件系统同步的时间间隔 1.核心原理 Cephfs异地同步基于CephFS-mirror&#xff0c;其工作原理是基于CephFS的快照功能和cephfs-mirror工具的异步复制机制。它通过…...

大数据专业学习路线

大数据专业学习路线 目录 基础知识核心技术进阶技能实战项目职业发展学习资源学习计划常见问题 1. 基础知识 1.1 编程语言 Python&#xff1a;大数据分析的基础语言 基础语法和数据类型函数和模块面向对象编程文件操作和异常处理常用库&#xff1a;NumPy, Pandas, Matplot…...

每日文献(十)——Part two

今天从第四部分 级联RCNN开始介绍。 目录 四、级联RCNN 4.1 级联边界框回归 4.2 级联检测 五、实验结果 5.1 实现细节 5.1.1 基准工作 5.2 质量不匹配 5.3 与迭代bbox和积分损失的比较 5.4 消融实验 5.5 与最先进的方法对比 5.6 泛化能力 5.7 PASCAL VOC数据集结果…...

8.3.1 MenuStrip(菜单)控件

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的 MenuStrip控件提供了程序窗体的主菜单&#xff0c;即显示于窗体顶端部分的菜单。 MenuStrip常用属性&#xff1a; ImageScalingSize…...

仿真每日一练 | ABAQUS子程序DLOAD

ABAQUS中用户子程序DLOAD可用于定义分布载荷幅值随坐标、时间、单元编号、积分点编号等的变化&#xff0c;该功能主要应用于定义复杂的载荷工况&#xff0c;今天给大家举一个简单的例子介绍其使用方式&#xff1a; 图1 模型认识 回顾一下ABAQUS的有限元分析流程&#xff1a; 图…...

Kubernetes(k8s)-备份Etcd介绍

作者介绍&#xff1a;简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们上一章介绍了Docker基本情况&#xff0c;目前在规模较大的容器集群基本都是Kubernetes&#xff0c;但是K…...

[leetcode]求最大公约数和最小公倍数(gcd和lcm算法)

求最大公约数和最小公倍数 Coding : 使用C的库 #include<iostream> #include<algorithm> using namespace std; int main() { int a, b; cout << "cin a and b of gcd : "; cin >> a >> b; int res __gcd(a, b);…...

B-tree 的原理源码分析及应用场景等

B-tree&#xff08;B树&#xff09;是一种自平衡的多路搜索树&#xff0c;广泛用于文件系统、数据库索引、键值存储系统等对大规模数据的高效插入、查找和删除有高要求的场景。相比于二叉搜索树&#xff08;BST&#xff09;&#xff0c;B-tree 可以减少磁盘I/O次数&#xff0c;…...

MySQL 中的聚簇索引和非聚簇索引有什么区别?

MySQL 中的聚簇索引和非聚簇索引有什么区别&#xff1f; 1. 从不同存储引擎去考虑 在MySIAM存储引擎中&#xff0c;索引和数据是分开存储的&#xff0c;包括主键索引在内的所有索引都是“非聚簇”的&#xff0c;每个索引的叶子节点存储的是数据记录的物理地址&#xff08;指针…...

重构居家养老安全网:从 “被动响应” 到 “主动守护”

随着全球老龄化加剧&#xff0c;居家养老安全成为社会关注的核心议题。 传统养老模式依赖人工巡检或单一传感器&#xff0c;存在响应滞后、隐私泄露、场景覆盖不足等问题。 由此智绅科技应运而生&#xff0c;七彩喜智慧养老系统构筑居家养老安全网。 而物联网&#xff08;Io…...

从静态绑定驱动模型到现代设备模型 —— 一次驱动架构的进化之旅

&#x1f50d; B站相应的视屏教程&#xff1a; &#x1f4cc; 内核&#xff1a;博文视频 - 从静态绑定驱动模型到现代设备模型 在 Linux 内核的发展历程中&#xff0c;设备驱动结构经历了从"硬编码 手动注册"的早期实现方式&#xff0c;到"设备模型统一管理&qu…...

MySQL学习笔记十五

第十七章组合查询 17.1组合查询 MySQL允许执行多个查询&#xff08;多条SELECT语句&#xff09;&#xff0c;并将结果作为单个查询结果集返回。这些组合查询通常称为并&#xff08;union&#xff09;或复合查询&#xff08;compound query&#xff09;。 以下几种情况需要使…...

NLP基础知识 与 词向量的转化方法 发展

目录 1.NLP 基础知识点 为什么需要自然语言处理? 自然语言处理有哪些分类? 自然语言处理有哪些实际应用? 为什么需要自然语言处理? 自然语言处理有哪些分类? 自然语言处理有哪些实际应用? 自然语言处理的技术/工作原理是什么? 2.NLP文本转化为词向量的方法 2…...

VectorBT量化入门系列:第四章 高级策略开发与优化

VectorBT量化入门系列&#xff1a;第四章 高级策略开发与优化 本教程专为中高级开发者设计&#xff0c;系统讲解VectorBT技术在量化交易中的应用。通过结合Tushare数据源和TA-Lib技术指标&#xff0c;深度探索策略开发、回测优化与风险评估的核心方法。从数据获取到策略部署&am…...

JVM虚拟机篇(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解

JVM垃圾回收器全面解析与G1深度探秘及四种引用详解 JVM虚拟机&#xff08;七&#xff09;&#xff1a;JVM垃圾回收器全面解析与G1深度探秘及四种引用详解一、JVM有哪些垃圾回收器1. Serial回收器2. ParNew回收器3. Parallel Scavenge回收器4. Serial Old回收器5. Parallel Old回…...

【蓝桥杯】15届JAVA研究生组F回文字符串

一、思路 1.这题去年考的时候想的是使用全排列进行尝试&#xff0c;实际不用这么麻烦&#xff0c;只用找到第一个和最后一个非特殊字符串的位置&#xff0c;然后分别向内检查是否对称&#xff0c;向外检查是否对称直到左指针小于0(可以通过添加使其对称) 2.至于如何找到第一个…...

TDengine 语言连接器(Python )

简介 taospy 是 TDengine 数据库面向 Python 语言提供的官方连接器&#xff0c;连接器对外提供对数据库写入、查询、订阅等多种访问接口。 安装连接器命令如下&#xff1a; # 原生连接和 REST 连接 pip3 install taospy# WebSocket 连接&#xff0c;可选装 pip3 install tao…...

Android compose源码浅析——Modifier

Modifier浅析 Modifier的使用foldOutfoldInanyall总结Modifier的使用 先来一段代码1: @Preview(showBackground = true) @Composable fun GreetingPreview() {ComposeTestTheme {Box(modifier = Modifier.size(DpSize(Dp(100f),Dp(100f))).padding(Dp(10f)).background(Colo…...

基于机器视觉的多孔零件边缘缺陷检测(源码C++、opencv、凸包、凸缺陷检测)

&#x1f451;主页&#xff1a;吾名招财 &#x1f453;简介&#xff1a;工科学硕&#xff0c;研究方向机器视觉&#xff0c;爱好较广泛… ​&#x1f4ab;签名&#xff1a;面朝大海&#xff0c;春暖花开&#xff01; 基于机器视觉的多孔零件边缘缺陷检测&#xff08;源码C、ope…...

JAVAWeb_Servlet:前置准备与理论简易介绍

要写JAVA_Web&#xff1a;首先就得建个项目——如何在Eclipse新建一个Web项目-CSDN博客 然后我们考虑具体的代码细节&#xff08;接下来就是我们的前置准备&#xff09; 一、导包&#xff1a; 在 Eclipse 中&#xff0c;如果需要快速导入缺失的包&#xff08;例如&#xff0…...

反射 tcp

反射 临时越过权限 获取成员变量1并进行修改 成员方法 TCP客户端...

UML综合实验四

1. 计算机包含内存(RAM)、CPU等硬件设备&#xff0c;根据下面的“产品等级结构-产品族”示意图&#xff0c;使用抽象工厂模式实现计算机设备创建过程并绘制相应的类图。 2. 电脑组装工厂可以将CPU、内存、硬盘、主机、显示器等硬件设备组装在一起构成一台完整的电脑&#xff0c…...