news 2026/4/15 9:54:50

Java 面试小册 | HashMap 的 put 方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 面试小册 | HashMap 的 put 方法

面试官(张姐):哈喽 malog!今天咱们聚焦下 HashMap 的源码细节 —— 这可是 Java 面试的 “必考题”,你平时有没有扒过它的 put 方法流程呀?

malog:张姐好!必须扒过~毕竟写业务代码天天用 HashMap,不搞懂源码总觉得心里没底哈哈。


问答环节

面试官(张姐):那你先给我捋捋,HashMap 调用 put 方法时,底层的 putVal 是咋干活的?

malog:行!putVal 的流程大概分 “初始化→算索引→插数据→查扩容” 这几步~首先会先瞅 table 数组是不是空的,要是没初始化,就调用 resize () 整个默认长度 16 的数组;然后给 key 算 hash 值 —— 这里有个 “扰动算法”,把 key 的 hashCode 高 16 位和低 16 位异或一下,再和数组长度减 1 做位运算,算出要放的索引位置。要是这索引位置是空桶(table [i] == null),直接插新节点就行;要是非空,就分情况:要么 key 重复了直接覆盖 value,要么是红黑树节点就往树里插,要么是链表就遍历到尾巴插新节点 —— 插完还得看链表长度是不是超 8,不过光超 8 还不够,得数组长度也超 64 才会转红黑树,不然只是扩容~最后插完了要是 size 超过阈值(容量 ×0.75),就再 resize 扩容。

面试官(张姐):细节挺到位!那我追问下:那个 “扰动算法” 到底为啥要搞个高 16 位和低 16 位异或?直接用 hashCode 不行吗?

malog:还真不行!比如数组初始长度是 16,(n-1) 就是 15(二进制是 00001111),要是直接用 hashCode 和它做位运算,只有低 4 位参与计算,高 16 位的特征就浪费了,很容易撞哈希冲突。把高 16 位和低 16 位异或,相当于让高位的 “特征” 也混到低位里,散列性更好,能少点冲突~

面试官(张姐):懂了!那常有人说 “HashMap 链表长度到 8 就转红黑树”,这说法对吗?

malog:这是个常见误区!得满足两个条件:链表长度 > 8 且 数组长度 > 64。要是数组长度没到 64,就算链表长过 8,也不会转红黑树,而是触发扩容 —— 毕竟数组太小的时候树化,反而占内存,不如先扩容让数据更分散~

面试官(张姐):那 put 完之后,啥时候会触发扩容?扩容是咋扩的?

malog:当 size(实际存储的键值对数量)超过阈值(threshold = 容量 × 负载因子,默认负载因子是 0.75)的时候,就会调用 resize () 扩容。扩容是把数组容量翻倍,然后把旧数组里的节点重新计算索引,迁移到新数组里 ——Java 8 之后迁移的时候还会顺便把链表拆成两个,效率比之前高不少。

面试官(张姐):不错不错,源码细节吃得挺透!


重点问题和参考回答

序号重点问题参考回答
1HashMap 的 put 方法底层(putVal)流程是啥?分 4 步:① 检查 table 数组,未初始化则调用 resize () 初始化(默认长度 16);② 用 “扰动算法” 计算 key 的 hash 值,结合数组长度得到索引;③ 空桶直接插节点,非空则分情况(key 重复覆盖 value / 红黑树插入 / 链表尾插,满足条件则树化);④ 插入后 size 超阈值则触发 resize () 扩容。
2扰动算法(hash 方法)的作用是啥?把 key 的 hashCode 高 16 位与低 16 位异或,让高位特征参与索引计算,增强散列性,减少哈希冲突(避免仅低几位参与运算导致的冲突)。
3HashMap 链表转红黑树的条件是啥?需同时满足:① 链表长度 > 8;② 数组长度 > 64。若数组长度不足 64,链表超长会触发扩容而非树化。
4HashMap 的扩容触发条件和扩容逻辑是啥?触发条件:size(实际键值对数量)> 阈值(容量 × 负载因子 0.75);扩容逻辑:数组容量翻倍,重新计算旧节点的索引并迁移到新数组,Java 8 后会拆分链表提升效率。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 13:11:13

终极时间转换方案:ms.js 从入门到精通

终极时间转换方案:ms.js 从入门到精通 【免费下载链接】ms 项目地址: https://gitcode.com/gh_mirrors/msj/ms.js 还在为时间单位转换而烦恼吗?ms.js 正是你需要的解决方案。这个轻量级 JavaScript 库能够轻松在各种时间格式之间进行转换&#x…

作者头像 李华
网站建设 2026/4/11 5:40:18

远程办公终端管理:一体化平台如何破解分散化挑战?

随着混合办公模式成为常态,企业面临着日益严峻的终端管理挑战。员工使用的设备散布在不同网络环境,操作系统各异,安全配置不一——这种分散性给IT部门带来了前所未有的管理压力。分散化管理中的实际痛点安全漏洞难以闭环:2023年的…

作者头像 李华
网站建设 2026/4/10 19:40:34

19、VMware App Volumes 操作指南与配置详解

VMware App Volumes 操作指南与配置详解 1. 创建新虚拟硬盘 在创建新虚拟硬盘时,首先要完成一系列准备工作。当所有配置选项完成后,在“Ready to Complete”框中,仔细回顾已配置的选项,确认无误后点击“Finish”按钮,即可成功创建新的虚拟硬盘。 2. 初始化并格式化新硬…

作者头像 李华
网站建设 2026/4/15 8:27:43

springboot校园管理系统的设计与实现(11493)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告)远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2026/4/13 18:46:55

springboot母婴商城系统(11497)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告)远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2026/4/11 10:30:02

MVVM模式、分层架构设计

一、MVVM模式 应用通过状态去渲染更新UI是程序设计中相对复杂,但又十分重要的,往往决定了应用程序的性能。程序的状态数据通常包含了数组、对象,或者是嵌套对象组合而成。在这些情况下,ArkUI采取MVVM Model View ViewModel模式…

作者头像 李华