HashMap底层原理本质是:数组定位置、哈希算下标、链表或红黑树解冲突、扩容保效率;采用Node[]数组(容量为2的幂)、哈希扰动、(n-1)&hash寻址、链表≥8且数组≥64时树化、负载因子0.75触发2倍扩容。

HashMap 底层原理的核心,一句话就能抓住本质:数组定位置、哈希算下标、链表(或红黑树)解冲突、扩容保效率。
哈希桶数组 + 位运算寻址
底层主干是一个Node[] 数组,每个元素叫一个“桶”;容量始终是2 的幂次方(如 16、32、64),这样可以用 (n - 1) & hash 替代 hash % n,位运算快一个数量级。这是性能关键设计,不是凑巧。
哈希扰动与 null 键特殊处理
hash(Object key) 方法做了两件事:对 null 键直接返回 0;对非 null 键,用 h ^ (h >>> 16) 扰动——把高 16 位和低 16 位异或,让低位也携带高位特征,大幅降低哈希碰撞概率。所以“好哈希函数 = 均匀 + 扰动”是金句之一。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
冲突解决:从链表到红黑树的动态演进
JDK 1.8 不再是纯链表。当某个桶中链表长度 ≥ 8 且 数组长度 ≥ 64 时,才转为红黑树;节点 ≤ 6 时又退化回链表。这不是“越早树化越好”,而是空间换时间的权衡:小链表用链表更轻量,长链表上树保 O(log n) 查询。记住:“8 是树化阈值,6 是退化阈值,64 是树化前提”。
立即学习“Java免费学习笔记(深入)”;
扩容机制:2 倍增长 + 元素重散列
触发条件是 size > threshold(= capacity × loadFactor),默认负载因子 0.75 是时间与空间的折中——太小浪费内存,太大增加冲突。扩容后容量翻倍,原索引位置的元素只可能落在两个位置:原索引 或 原索引 + oldCap,靠 hash 的最高位决定,不用重新全部取模,这是 JDK 1.8 的优化亮点。

















