没有 hashCode() 的 equals()

equals() without hashCode()

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

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

我的顾虑: -如果我总是将 hashCode() 与 equals() 一起实现,将会有很多代码没有真正使用,并且没有单元测试覆盖。 (如果不使用,我不会对 hashCode() 进行单元测试) -直到我将对象放入基于哈希的容器中时,我才知道如何查找这些对象。只有到那时我才能确定使用哪种哈希策略。

我可以只实现equals()而不实现hashCode()吗?

是的,你可以。因为它们只是从父 class Object 获取方法,所以实际上您可以选择是否实施(一起或单独实施。)

All Java bibles say these two MUST be implemented together.

如果你没有使用任何与hashcode相关的东西(正如你所说的基于哈希的容器)它不是MUST,但是最好将它们一起实现以避免任何意外情况.

可以,但是推荐吗?没有

所有书籍都说,如果等于 returns 为真,则哈希码必须相同,事实就是如此。但是,最好为您自己的实例进一步指定它,就像您对 equals 所做的那样。

只要实现 hashCode 不是强制性的,每当你实现 equals 时,你也必须实现 hashCode

If you fail to do so, you will end up with broken objects. Why? An object’s hashCode method must take the same fields into account as its equals method. By overriding the equals method, you’re declaring some objects as equal to other objects, but the original hashCode method treats all objects as different. So you will have equal objects with different hash codes. For example, calling contains() on a HashMap will return false, even though the object has been added.

是的,只能实现equals()方法,不能实现hashcode()方法。

但标准做法是您应该同时实现它们,并且对于相同的对象,哈希码应该相同。

你可以,但是你会破坏 equals 的一般契约,这会导致奇怪的错误。即使您认为自己没有使用散列代码,您将对象传递给的任何外部代码也可能依赖于它们,即使它看起来不是基于散列的。如果你不打算给你的对象一个像样的散列方法,至少让它抛出一个运行时异常。不过,为您的对象提供合适的 hashCode 几乎总是更好。

嗯,显然你可以,但你不打算使用散列这一事实并不能成为不实施它的充分理由。您使用的一些库可以使用散列。如果您想避免测试 equals 或 hashcode,您可以尝试自动生成这些方法(大多数 IDE 都具有该功能),或者使用项目 lombok (https://projectlombok.org)

Oracle 的教程answers 这个

The hashCode() Method

By definition, if two objects are equal, their hash code must also be equal. If you override the equals() method, you change the way two objects are equated and Object's implementation of hashCode() is no longer valid. Therefore, if you override the equals() method, you must also override the hashCode() method as well.