重写hashCode与equals后,HashMap.get()为何未返回预期null?
HashMap.get() 方法执行逻辑解析
你的代码里map.get(ob1)能返回"A",核心原因是传入的key和put时存储的key是同一个对象引用,HashMap的get方法会优先用引用相等判断,而非直接调用equals。
具体执行流程拆解:
- 先调用传入key的
hashCode()计算哈希值,定位到HashMap数组中对应的桶位置。 - 遍历该桶内的元素(链表/红黑树结构),对每个元素依次做判断:
- 先判断当前元素的key是否和传入的key引用完全相同(用
==运算符),如果是,直接返回对应的value,不会触发equals()方法。 - 只有当引用不同时,才会调用
equals()方法判断逻辑相等性,相等则返回value。
- 先判断当前元素的key是否和传入的key引用完全相同(用
回到你的代码场景: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
相关产品推荐
相关产品推荐

