java hashmap替换key,HashMap 用可变对象作为 key 踩坑

本文探讨了Java HashMap中当对象作为key时,未重写equals和hashCode导致get方法返回null的原因。作者解释了默认行为下两个不同对象地址导致的查找失败,并演示了重写这两个方法以确保正确匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击上方☝

Java编程技术乐园,轻松关注!

及时获取有趣有料的技术文章

做一个积极的人编码、改bug、提升自己

我有一个乐园,面向编程,春暖花开!

9abe61f96fb8d4dfa0b642e368b79860.png

作者:Icharle

https://icharle.com/hashmapkebianobj.html

前言

在 Java 道路上越踩越多坑,最近被问到一个知识点,当对象作为 HashMap 一个 key 时,在未重写equals和hashcode方法时候,get方法返回的值为null。

分析

在下面一段代码中,未重写 equals 以及 hashCode 方法情况下,输出结果为null。

bd5f7cb25fcd250b1d3c0d77eb48ccbb.png

改造后代码:

ac7467a6de2708cad0ab2aacecf045dc.png

原因分析

HashMap 在查找某一个 key 时,先是用 hashCode 函数根据该 key 的地址计算,再用 equals 函数根据对象的地址进行比较。

在代码片段一中 : map.put(new People("icharle"), 18); 以及System.out.println(map.get(new People("icharle")));中默认是两个对象 (也就是说两个对象的地址不一样,自然 hashcode 函数得到的值是不一样 (因为两个的对象的地址不同,自然在 equals 时候更不可能相等,最终得到的结果为 null。

在代码片段二中:重载hashCode()函数的作用是:对于同一个 key,得到相同的 hash 值,重载equals()函数的作用是:向HashMap表明当前对象和 key 上所保存的对象是相等的。因此该情况下最终结果为 18

8ad2422a8df249b00df35737f5a2dcf0.gif

往期精彩回顾

644f7004bf23e7e5434df65ebcbb1fcb.png

f6c5d3b6061331b5fa53c2153e6b924a.png欢迎长按下图关注公众号

f6c5d3b6061331b5fa53c2153e6b924a.png

后台回复【资源】,获取珍藏干货!

99.9%的伙伴都很喜欢

ca340fd84a10cce52f878f6f9298e387.png

3af57a6008b91aa7b425bff3d6f01ee6.png

朕已阅

f14e1f639c93401402c839924995a5f3.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值