0

0

Java中HashMap的底层数据结构是什么_数组+链表+红黑树图解

P粉602998670

P粉602998670

发布时间:2026-03-12 10:33:58

|

545人浏览过

|

来源于php中文网

原创

hashmap底层是数组+链表+红黑树协同,但红黑树仅在链表长度≥8且数组长度≥64时触发,基于泊松分布设定阈值以检测哈希异常,数组长度必为2的幂以保障位运算均匀散列。

java中hashmap的底层数据结构是什么_数组+链表+红黑树图解

HashMap底层用的是数组+链表+红黑树,但不是固定组合

Java 8 开始,HashMap 的底层确实是数组 + 链表 + 红黑树三者协同,但红黑树只在特定条件下触发——不是每个桶(bucket)默认就上树。核心逻辑是:数组存头节点,冲突时先链表,链表长度 ≥ 8 且数组长度 ≥ 64 才转红黑树。

这么设计是为了平衡查找效率和建树开销:短链表用遍历足够快,强行转树反而亏;而长链表在哈希碰撞严重时,O(n) 查找太慢,升成红黑树能压到 O(log n)。

  • static final int TREEIFY_THRESHOLD = 8:链表转树阈值,但只是“必要不充分”条件
  • static final int MIN_TREEIFY_CAPACITY = 64:数组最小容量要求,避免小数组频繁树化/退化
  • 退化规则相反:红黑树节点 ≤ 6 时,会退回到链表,不是固定“7退6”这种模糊说法

为什么链表长度≥8才考虑转红黑树

这个数字不是拍脑袋定的,而是基于泊松分布推导出的——在理想哈希均匀前提下,链表长度达到 8 的概率已低于十万分之一。换句话说,真出现长度 ≥ 8 的链表,大概率说明发生了哈希碰撞异常(比如 key 的 hashCode() 写得差,或数据本身有强规律)。

所以它本质是个“异常检测开关”,不是性能调优参数。别想着把 TREEIFY_THRESHOLD 改成 4 来“提前优化”,反而会让正常场景多出一堆小红黑树,徒增内存和维护成本。

立即学习Java免费学习笔记(深入)”;

紫东太初
紫东太初

中科院和武汉AI研究院推出的新一代大模型

下载
  • 改小阈值 → 更多树结构 → GC 压力增大、对象头开销变高、CPU 缓存局部性下降
  • 改大阈值 → 长链表滞留时间变长 → 在极端碰撞场景下,get() 可能卡在 O(n) 而无法回落
  • 真正该做的是重写 key 类的 hashCode()equals(),让散列更均匀

数组长度为什么必须是2的幂次方

因为 HashMap 计算元素存放位置不用取模 %,而是用位运算 & (table.length - 1)。这要求 table.length 是 2 的幂,否则 length - 1 就不是全 1 的二进制数,位运算结果会丢失高位信息,导致大量索引集中到低地址段。

比如长度为 16(0b10000),length - 1 == 15 == 0b1111,和 hash 值做 & 运算,等价于取低 4 位,能均匀映射到 0~15;但如果长度是 15,length - 1 == 14 == 0b1110,最高位永远被清零,相当于浪费了整个高位散列能力。

  • 扩容时始终翻倍(oldCap ),保证始终是 2 的幂
  • 构造函数传入初始容量,会被自动提升到最近的 2 的幂(如传 10 → 实际建 16 的数组)
  • 别手动传 100 这种非 2 幂值指望“省空间”,反而因扩容多一次,更费时间和内存

红黑树节点退化回链表的时机容易被误解

很多人以为只要树里删到剩 6 个节点就立刻退化,其实不是。真实逻辑是:在 treeifyBin()resize() 期间检查树节点数,只有 ≤ 6 才触发 untreeify();日常 remove() 不会实时退化,要等到下次扩容或树操作时才判断。

这意味着你可能看到一个只有 3 个节点的红黑树长期存在——它没毛病,也不浪费,因为退化本身也有开销,没必要为几个节点反复折腾。

  • 退化不是“懒删除”的补救,而是 resize 时顺手做的清理动作
  • 如果 map 长期不扩容,小红黑树就一直保持树形态,不会自动降级
  • 这也解释了为什么 jstack 或 jmap 看到的 TreeNode 实例数,不一定和当前有效 key 数严格对应

实际用的时候,与其纠结红黑树怎么转,不如盯住两件事:key 的 hashCode() 是否合理,以及预估容量是否够用。其他都是系统在背后默默扛着的细节。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

611

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

334

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

549

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

30

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

44

2026.01.06

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号