怎么理解 HashMap 的底层哈希表实现

阿瑶姑娘_8030

阿瑶姑娘_8030

2026-04-29

273人浏览

原创

hashmap底层是数组+链表/红黑树结构,通过哈希函数定位桶,用链表解决冲突,链表≥8且数组≥64时转红黑树,需重写hashcode()和equals(),超阈值触发扩容。

怎么理解 hashmap 的底层哈希表实现

HashMap 的底层哈希表实现,本质是用“数组 + 链表/红黑树”模拟一张逻辑上的散列表(Hash Table),核心目标是把任意键(Key)快速映射到一个固定位置,从而实现平均 O(1) 的存取效率。

数组是主干,“桶”决定落点

HashMap 底层维护一个 Node[] table 数组,每个数组元素叫一个“桶(bucket)”。这个数组不是按顺序存数据的,而是靠键的哈希值算出下标——比如键 "user123" 经过 hashCode() 和扰动运算后得到哈希值 1987,再对数组长度取模(如 1987 % 16 = 3),就落到索引为 3 的桶里。这个过程就是哈希函数定位。

冲突不可避免,链表和红黑树来兜底

不同键可能算出相同下标(哈希冲突),比如 "abc" 和 "def" 都落到索引 5。这时不能覆盖,而是把新节点接在原节点之后,形成链表:

  • 默认插入链表头部(JDK 7 是头插,JDK 8 改为尾插,避免并发扩容时的环形链表问题)
  • 当链表长度 ≥ 8 且 数组长度 ≥ 64 时,链表自动转为红黑树,提升查找性能(从 O(n) 降到 O(log n))
  • 若树中节点数 ≤ 6,则退化回链表,避免小数据量时树结构开销过大

键的比较必须成对重写:hashCode() + equals()

HashMap 判断两个键是否相等,分两步走:

  • 先比 hashCode():不等 → 肯定不同键 → 直接放入新桶或链表尾
  • 若相等 → 再调用 equals() 比内容:返回 true → 视为重复键,覆盖 value;返回 false → 视为不同键,链表/树中新增节点

所以自定义类作 Key 时,必须同时重写 hashCode() 和 equals(),否则哪怕内容一样,也会被当成两个不同键存两次。

扩容不是小事,影响性能的关键环节

初始容量默认是 16,加载因子默认是 0.75。当 size >= capacity × loadFactor(即元素数 ≥ 12)时,触发扩容:

  • 新建一个容量翻倍的数组(如从 16 扩到 32)
  • 所有已有 Node 重新计算哈希、重新取模,分配到新数组对应桶中
  • 链表或红黑树节点也跟着迁移,红黑树还会在迁移中做平衡调整

扩容耗时,所以如果预估数据量大,建议初始化时指定合理初始容量(如 new HashMap(1024)),减少 resize 次数。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

470

5

golang map相关教程
golang map相关教程

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

2025.11.16

323

7

golang map原理
golang map原理

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

2025.11.17

493

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

263

6

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

80

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

80

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

40

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

40

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

60

15

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习