news 2026/6/23 21:10:29

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/6/23 20:44:55

DTIIA 5.0 输送机系统设计说明

单台输送机IIA 手册 第2章~第4章 介绍了单台输送机 从 整机设计、设计计算、部件选型的设计过程。多台输送机但是,在实际应用中,输送机作为单台设备运转的情况是比较少见的。一般都是 多台输送机 联合运转 或是 与工艺设备组合完成某种工艺生产过程&…

作者头像 李华
网站建设 2026/6/23 17:30:56

JavaEE进阶——SpringBoot统一功能处理实战指南

目录 Spring Boot统一功能处理详解(新手完整版) 1. 拦截器详解 1.1 什么是拦截器 1.2 完整代码实现(逐行注释) 1.2.1 定义登录拦截器(传统Session方式) 1.2.3 定义登录拦截器(现代Token方…

作者头像 李华
网站建设 2026/6/23 12:21:53

leetcode 2110. 股票平滑下跌阶段的数目 中等

给你一个整数数组 prices ,表示一支股票的历史每日股价,其中 prices[i] 是这支股票第 i 天的价格。 一个 平滑下降的阶段 定义为:对于 连续一天或者多天 ,每日股价都比 前一日股价恰好少 1 ,这个阶段第一天的股价没有…

作者头像 李华
网站建设 2026/6/23 13:29:24

15、智能平台管理接口驱动与直接内存访问技术解析

智能平台管理接口驱动与直接内存访问技术解析 1. 智能平台管理接口(IPMI)驱动案例分析 IPMI驱动在系统管理中起着重要作用,下面我们将对其核心函数进行详细分析。 1.1 ipmi2_pci_probe函数 该函数用于判断设备是否为PCI总线上的通用IPMI设备。以下是其代码实现: stat…

作者头像 李华
网站建设 2026/6/23 10:46:46

Ability Kit(程序框架服务)Stage模型

应用模型 应用模型是系统为开发者提供的应用程序所需能力的抽象提炼,它提供了应用程序必备的组件和运行机制。有了应用模型,开发者可以基于一套统一的模型进行应用开发,使应用开发更简单、高效。 应用模型的构成要素包括: 应用组…

作者头像 李华
网站建设 2026/6/22 21:00:09

JVM内存结构与Java内存模型的区别

我们在讨论java语言的内存问题时经常会听到一个词叫“JVM内存模型”,这个词在实际使用中容易产生歧义,因为它通常可能指代两个密切相关但不同的概念:Java内存模型 (Java Memory Model, JMM):这是一个并发概念,定义了Ja…

作者头像 李华