为什么重写equals()时也要重写hashCode()?两者什么关系

来源:百度知道 编辑:UC知道 时间:2024/06/16 20:19:44
hashcode相等是不是equals一定相等?
如果同一个类的两个对象的属性值相等,那么他们的hashcode一定相等吗?
请不要抄前面别人的回答,我都看过了

没有硬性规定说必须两个一起重写
这只是一个经验之谈,建议这么做
因为这两个函数都可以重写
所以有写得好坏之分
完全可以hashcode相等的对象而equals确返回false
比如一个学生类的两个对象a,b
它们的属性 姓名 都是 张三
你完全可以认为a,b是相等的
所以在重写equals的时候可以写成只要对象的属性值相同equals就返回true
但是这两个对象的hashCode是不同的(理论上如此)
而又因为你可以重写hashCode,所以也可以让他们相同
重写hashCode是为了集合类存储这些对象的时候有个比较规则
比如Map不允许重复元素,就是通过hashCode来检测的

我相信既然你已经提到equals的重写问题,那么你一定知道equals是什么含义,所以我就不说它了,说说hashcode

首先我想说hashcode的调用的条件。
如果你想往map里面放一个类作为map的键值,这个类又是你自己设计的,或者这个类不是你写的但是你修改了这个类的equals方法,这个时候,你就要注意重写hashcode方法。
这样 当你往map里放值得时候,系统会调用这个对象的.hashcode()方法来生成相应的hash值,来映射相应的对象。

如果同一个类的两个对象的属性值相等,那么他们的hashcode一定相等吗
这个要看你具体如何实现你的hashcode,如果你希望他们的值一样hashcode也一样,你就可以这样实现。
但是hashcode的实现,一般要满足几个特征,比如
自反性,传递性什么的。