假设我有以下类(class)
public class DualKey {
int key1;
int key2;
// getters, setters and constructors go here
public void equals(Object obj) {
if (obj == null || ! obj instanceOf DualKey)
return false;
return this.key1 == obj.key1 || this.key1 == obj.key2 || this.key2 == obj.key1 || this.key2 == obj.key2;
}
}
是否可以以保留 equals 和 hashcode 约定的方式覆盖 hashcode?p>
PS:我意识到定义一个比较器可能会更好,但我正在使用 Spark,其中定义相等的唯一方法是重写 equals 方法。
最佳答案
不,这是不可能的,因为 equals()
实现不满足 Java API 要求:
The equals method implements an equivalence relation on non-null object references:
- It is reflexive: for any non-null reference value
x
,x.equals(x)
should returntrue
.- It is symmetric: for any non-null reference values
x
andy
,x.equals(y)
should returntrue
if and only ify.equals(x)
returnstrue
.- It is transitive: for any non-null reference values
x
,y
, andz
, ifx.equals(y)
returnstrue
andy.equals(z)
returnstrue
, thenx.equals(z)
should returntrue
.- It is consistent: for any non-null reference values
x
andy
, multiple invocations ofx.equals(y)
consistently returntrue
or consistently returnfalse
, provided no information used inequals
comparisons on the objects is modified.- For any non-null reference value
x
,x.equals(null)
should returnfalse
.
具体来说,它是不可传递的。根据您的定义, (1,2) == (2,3)
和 (2,3) == (3,4)
但 (1, 2) != (3,4)
.
这种非传递性使得不可能实现不平凡的哈希码方法。您唯一能做的就是为每个对象返回相同的数字。这将是一个有效的实现,尽管性能很差。
关于java - 在两个变量中的任何一个可以相等的情况下,重写 equals 和 hashcode 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39402812/