Java中为什么重写了equals方法就也要重写hashcode方法

Object的equals()和hashcode()方法

在Object类中,equals方法底层是通过 “==” 来比较两个对象是否相同,也就是比较两个对象的地址值,因为java规定,若equals()方法已经判定两个对象相同,那么这两个对象的hashcode()方法得到的hash值也应该是相同的。所以java的Object类中对hashcode的实现,其hash值的计算是由对象的地址决定的。

重写equals()不重写hashcode()的问题

假设你写了一个类,重写了equals()方法,将原来的底层逻辑 “==” 改为了按照对象值的内容进行比较。

此时就会出现这种情况:

对象A和对象B其值的内容是相同的,所以用equals()方法进行比较的时候,A和B是相同的,但是由于hashcode()方法没有重写,所以还是用的是Object类的实现。那么由于A和B的对象的地址值不同,那么他俩的hash值也必然不同。因此,会出现equals()判断相同,而hash值不同的情况。违背了Java的要求。那么当你使用HashSet,HashMap等类时,因为其底层插入数据与hash值的比较相关,所以就会出现问题。

因此,当你重写equals方法时,请按照Java的要求,也重写hashcode方法,这两个方法是配套使用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值