You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重写hashCode与equals后,HashMap.get()为何未返回预期null?

HashMap.get() 方法执行逻辑解析

你的代码里map.get(ob1)能返回"A",核心原因是传入的key和put时存储的key是同一个对象引用,HashMap的get方法会优先用引用相等判断,而非直接调用equals。

具体执行流程拆解:

  • 先调用传入key的hashCode()计算哈希值,定位到HashMap数组中对应的桶位置。
  • 遍历该桶内的元素(链表/红黑树结构),对每个元素依次做判断:
    1. 先判断当前元素的key是否和传入的key引用完全相同(用==运算符),如果是,直接返回对应的value,不会触发equals()方法。
    2. 只有当引用不同时,才会调用equals()方法判断逻辑相等性,相等则返回value。

回到你的代码场景:
ob1是同一个对象实例,put时存入的key就是这个引用,get时传入的也是它本身。所以遍历桶内元素时,第一步==判断直接成立,直接返回对应的"A",完全没用到你重写的始终返回false的equals()。

如果换个测试场景,比如创建新对象Student ob3 = new Student("A"),再调用map.get(ob3),这时候ob3和ob1是不同引用,就会触发equals()方法,因为你的equals始终返回false,这时候才会返回null。

另外你重写的hashCode()固定返回111,只会让ob1和ob2被放到同一个桶里,但这对get(ob1)的结果没有影响,因为引用判断已经提前命中了。

内容的提问来源于stack exchange,提问作者Ayush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 10:43:09