当前位置: 首页 > news >正文

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 后会拆分链表提升效率。
http://www.gsyq.cn/news/102554.html

相关文章:

  • KH-SMA-KWE17-G
  • 18、在Horizon View托管应用环境中部署App Volumes及高级配置指南
  • 20、App Volumes高级配置与其他选项详解
  • 终极时间转换方案:ms.js 从入门到精通
  • 远程办公终端管理:一体化平台如何破解分散化挑战?
  • GST标签蛋白纯化试剂盒
  • 从裂变能力竞争到技术水平竞争:开源AI智能名片链动2+1模式S2B2C商城小程序对微商企业竞争格局的重塑 - 实践
  • leetcode 2110. 股票平滑下跌阶段的数目 中等
  • 15、智能平台管理接口驱动与直接内存访问技术解析
  • 16、深入理解FreeBSD中的DMA管理与存储驱动
  • 2025年12月企业境外投资备案代理精选榜单 - 2025年11月品牌推荐榜
  • 小红书账号代运营服务哪家专业?2025年五大专业公司推荐与避 - myqiye
  • 基于SpringBoot的在线视频教育平台(11494)
  • 11、中断处理与并行端口驱动开发
  • springboot房产销售系统(11495)
  • springboot母婴商城系统(11497)
  • 一键生成电影级运镜:Motion LoRA让静态图片秒变动态大片
  • 甘青大环线景点综合评估与推荐指南 - 2025年11月品牌推荐榜
  • 如何快速使用ComfyUI-SeedVR2实现视频超分辨率:新手完整指南
  • 关于 iShellpro 或者 finalshell 使用图形化界面上传失败显示无权限的解决方案
  • 2024提示工程完全手册:从入门到精通
  • Iced Rust GUI框架编译优化实战:从配置到性能提升
  • 2025年12月龙卷风吸尘罩,中频炉吸尘罩,环保达标电炉吸尘罩公司推荐:行业测评与选择指南 - 品牌鉴赏师
  • ARM64平台Java 8环境快速搭建手册
  • 15亿参数撬动终端AI革命:Janus-Pro-1B开启多模态轻量化时代
  • 8、CentOS系统管理实用指南
  • 600M参数实现企业级文档处理:腾讯混元POINTS-Reader轻量化革命
  • 字节跳动Seed-OSS-36B:动态推理革命与企业级AI效率新标准
  • Tenable Identity Exposure 3.77.14修复多个关键漏洞 - 安全通告
  • 2025年五大AI机构检索服务排行榜:基于AI检索稳定性与A - mypinpai