equals()没有hashCode()

twu*_*twu 3 java hash hashcode

如果我只需要比较对象而不打算将对象放入任何基于散列的容器中,我是否只能实现equals()而不是hashCode()?

似乎所有Java圣经都说这两个必须一起实现.:(

我担心: - 如果我总是将equif()与hashCode()一起实现,那么将会有很多代码没有真正使用,并且没有单元测试覆盖.(如果不使用的话,我不打算单元测试hashCode()) - 直到我将对象放入基于散列的容器中才知道如何查找对象.直到那时我才能确定使用哪种散列策略.

use*_*ica 8

你可以,但是你将违反一般合同equals,这将导致奇怪的错误.即使你不认为你正在使用哈希码,你传递对象的任何外部代码也可能依赖于它们,即使它似乎不是基于哈希的.如果你不打算给你的对象一个合适的哈希方法,至少让它抛出一个运行时异常.但是,为对象提供一个不错的hashCode几乎总是更好.


Mos*_*yeb 5

Oracle 的教程回答了这个问题

hashCode() 方法

根据定义,如果两个对象相等,则它们的哈希码也必须相等。如果覆盖 equals() 方法,则会更改两个对象的等价方式,并且 Object 的 hashCode() 实现不再有效。因此,如果您覆盖 equals() 方法,则还必须覆盖 hashCode() 方法。