java中重写equals方法为什么不直接在里面比较hashcode()?
看书上说只要重写在一个类中重写equals方法,那就一定要重写hashcode方法,因为两个对象只要equals返回值为true,那么他俩的hashcode就一定相同。
那为什么不可以提前先写好hashcode函数,然后在equals函数里面直接来一行if(this.hashcode() == otherObject.hashcode()) return true;else return false;就行了?

3个回答

hashcode相同,两个对象可以相同,可以不同
hascode不同,两个对象必须不同。
这是hashcode的原则。

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复qq_23908539: 看怎么用。像hashtable之类的搜索算法用hashcode,有的算法直接equals
接近 5 年之前 回复
qq_23908539
qq_23908539 回复caozhy: hashcode我懂。总结起来也就是说java中对两个对象的比较是先比较hashcode然后再比较equals?
接近 5 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复qq_23908539: 再不明白,可以找一本数据结构教材,看散列表和散列算法,以及散列查找。
接近 5 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复qq_23908539: 性能的考虑。计算hashcode的开销比完整比较两个对象小。如果对象后很大的概率不同,那么比较hash,发现不同,就不用执行equals了
接近 5 年之前 回复
qq_23908539
qq_23908539 是的。可是这么说的话那hashcode这个方法存在的意义到底是什么?如果说是为了比较两个对象是否相等的话,那用equals不就行了么
接近 5 年之前 回复

equals除了影响hashcode以外,它还有3个原则:
它必须是对称的,如果a.equals(b)成立,那么b.equals(a)必须成立,反之亦然。
它必须是自反的,a.equals(a)必须永远成立。
它必须是传递的,a.equals(b)和b.equals(c)成立,那么必须保证a.equals(c)成立。

hashcode不同,对象一定不同,而hashcode相同,对象不一定相同
而equals却要一个确定性的结果,相同就是相同,不同就是不同

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问