当前位置: 首页 > 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.jsqmd.com/news/92150/

相关文章:

  • 一文看懂 Claude Skills 原理
  • KH-SMA-KWE17-G
  • Lucky网络唤醒实战指南:5步轻松实现远程设备开关机
  • 18、在Horizon View托管应用环境中部署App Volumes及高级配置指南
  • 19、VMware App Volumes 操作指南与配置详解
  • 前端开发者必看:LobeChat的Next.js技术栈优势剖析
  • 800亿参数仅激活130亿,腾讯混元A13B改写大模型效率规则
  • 20、App Volumes高级配置与其他选项详解
  • AutoGPT项目常见报错及解决方案汇总
  • 上海人气排名好的留学中介机构一览表 - 留学品牌推荐官
  • 终极时间转换方案:ms.js 从入门到精通
  • 2025年北京婚姻律所权威推荐榜单:离婚事务所/离婚房产律所/离婚精英律师精选 - 品牌推荐官
  • 2025上海留学机构前十名 - 留学品牌推荐官
  • 远程办公终端管理:一体化平台如何破解分散化挑战?
  • 2025上海留学机构有哪些大学 - 留学品牌推荐官
  • Spring Boot 入门实战:10 分钟搞定接口开发,新手零踩坑指南
  • 2025上海留学中介有哪些 - 留学品牌推荐官
  • 2025上海申请研究生的中介机构 - 留学品牌推荐官
  • GST标签蛋白纯化试剂盒
  • 2025上海最好留学中介公司是哪家呢 - 留学品牌推荐官
  • 留学澳洲,选这些上海靠谱中介就对了 - 留学品牌推荐官
  • 从裂变能力竞争到技术水平竞争:开源AI智能名片链动2+1模式S2B2C商城小程序对微商企业竞争格局的重塑 - 实践
  • Python RPA实战:首发建设工程资料自动化填报与流程审批系统设计
  • 2025哈尔滨蛋糕培训机构TOP5权威推荐:蛋糕培训机构一般 - 工业推荐榜
  • leetcode 2110. 股票平滑下跌阶段的数目 中等
  • 2025年五大GEO搜索系统方案排行榜,服务客户多的GEO搜 - 工业品牌热点
  • 上海美国硕士留学中介机构排名前十名 - 留学品牌推荐官
  • 2025年五大服务优的Ai搜索公司排行榜,快速智能搜索服务商 - mypinpai
  • 2025年医用擦手纸供应商TOP5权威推荐:环保型源头厂家甄 - myqiye
  • 2025年北京离婚房产律所权威推荐榜单:婚姻律所/离婚事务所/离婚律所团队精选 - 品牌推荐官