重写equals为什么要重写hashCode

本文详细介绍了Java中equals()和hashCode()方法的作用。equals()默认使用“==”比较对象地址,而重写equals()是为了比较对象内容。hashCode()用于计算对象的哈希码,常在HashMap等集合中用于快速定位。当对象值相等时,需要重写hashCode()以确保哈希码相同,避免HashMap中键值对冲突。重写这两个方法对于保证集合操作的正确性至关重要。
摘要由CSDN通过智能技术生成

equals方法和hashCode具体是什么?

在源码中我们可以看到,这两个方法都是Object()对象的默认方法。
hashCode()获取的是一个int值,而这个int值就可以认为是通过内存地址计算出来的一个哈希码。
equals()方法默认是使用 “==” 进行运算,那么也就是说,对比的是两个对象的地址是否相等。
在这里插入图片描述

为什么要重写equals()?

最简单的举例,当我们new出来两个String对象,如果只是使用默认的equals()来对比的话,那么直接就是对比的对象的内存地址,而两个对象的内存地址肯定不会一样的。
但是,这两个对象的值其实是相等的,所以需要我们重写equals()方法来直接对比这两个对象的值。

String a = new String("123");
String b = new String("123");

为什么要重写hashCode()?

我们已经知道,hashCode对比的是通过内存地址计算出来的哈希码,那么最常见的就是在HashMap集合中的使用。
hashMap集合的结构只要有基础应该都知道吧,是一个数组+链表(红黑树)的key-value结构。

在这里插入图片描述
当put()存入一条数据的时候,肯定是要先通过key来判断当前数组中是否有相同的值存在了,如果有的话就要覆盖掉。那么这个链表是怎么来的呢?
这个数组就我们可以先认为是一个hash表,当put一个数据的时候,首先会判断两个key的hashCode码是否相等(这里就是通过两个数据的内存地址计算出来hashCode),如果两个内存地址算出来的hashCode差别比较小,那么计算出的数组下标就可能会在同一个位置,需要判断两个对象的值是否相等。

那么在这里我们已经知道了HashMap使用了hashCode()方法,如果存入上面例子中的两个String对象的话,他们的值相等但是内存地址不相等,所以
hashCode就有可能也不相等
,于是就可能会把这两个对象分别放入不同的数组下标中,他们就碰不到了。那不就出问题了吗。

在这里插入图片描述
所以hashCode()也是要重写的,要保证两个对象值相等的话,hashCode一定相等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木小同

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值