为什么重写equals方法就要重写hasCode()方法?

1.    equals方法本身会先用==来判断对象的地址是否相同,如果对象的地址相同就返回true。如果==判断两个对象的地址不同,就会继续比较两个字符串的值是否相等,如果相等就返回true(这里引出一下自己学习中的见解,也是方便自己复习)

“在默认方法中equals继承父类Object类,方法和==相同,在对字符串进行比较时会自动重写equals方法。如果想判断自定义的属性,例如年龄等一般需要重写tostring()方法,判断年龄是否相等”。

2.  在java中,几乎所有的对象都继承Object类,Object包含了hasCode方法,所以几乎所有对象都有hasCode方法返回对应的哈希值,在往哈希表(HasMap)(HasSet)存储数据时,会先对两个对象的哈希值取模运算判断是否相同(因为哈希表的大小是有限的,所以会出现即使不是同一个对象,但是哈希值却是相同的,这就需要更强力的equals来比较元素是否相同,哈希冲突),这样做的目的降低了equals的使用次数,增强了效率(为什么hasCode的效率比equals强,因为hasCode方法计算的是对象的返回值,而equals会去比较对象的内容 ,如果包含多属性和递归就更复杂)equals来判断两个对象的值是否相同,如果相同就覆盖,如果不同就散列到哈希表的其他位置。

举个例子 比如我有一个对象1名字叫Tom,对象2也叫Tom,明明我的equals重写过了是相同的,但是在往哈希表存数据的时候,还是无法去重,除非我把hasCode也重写了,让他名字相等就哈希值相等。

现在来简短的回答一下问题,如果x.equals(y)==true,那么他们的对象肯定是同一个,并且hasCode的值必然相同。

可是如果只重写了equals方法就会导致x.equals(y)成立但是hasCode的值不相同,就会导致一个相同的对象被存入到表中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值