我目前面临的情况是我有String元组(大小为2),如果它们至少有一个共同的元素,则应该认为两个元组是相等的.我有以下课程实现这个想法:
public class MyTuple { private Listlist = Arrays.asList(new String[2]); public List getList() { return list; } public void set(String firstElement, String secondElement) { list.set(0, firstElement); list.set(1, secondElement); } @Override public boolean equals(Object other) { if (other instanceof MyTuple) { return !Collections.disjoint(this.list, ((MyTuple) other).getList()); } return false; } }
但是,根据hashCode()
合同:
如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode()方法必须生成相同的整数结果.
如何覆盖我的hashCode()
方法不违反合同?
在考虑之前hashCode()
,我认为你应该首先重新考虑你的设计equals()
.我认为你不能实施equals()
和履行所要求的合同 - 尤其是关于及物性的合同
来自:Java Doc ofObject#equals()
equals方法在非null对象引用上实现等价关系:
它是自反的:对于任何非空引用值x,x.equals(x)应该返回true.
它是对称的:对于任何非空引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true.
它是传递性的:对于任何非空引用值x,y和z,如果x.equals(y)返回true而y.equals(z)返回true,则x.equals(z)应返回true.
它是一致的:对于任何非空引用值x和y,x.equals(y)的多次调用始终返回true或始终返回false,前提是不修改在对象的equals比较中使用的信息.
对于任何非空引用值x,x.equals(null)应返回false.
为什么?我可以构建你的三个对象MyTuple
:
A = {x1,x2}
B = {x2,x3}
C = {x3,x4}
其中x1
,x2
,x3
,x4
是完全不同的.我现在有
A.equals(B)返回true
B.equals(C)返回true
C.equals(A)返回false
他们违反了关于及物性的合同.
我认为你应该考虑使用你自己的另一种关系(也许partialEquals()
),这样你就不必遵守合同了.但你也不能使用类似的方法equals()
,并希望MyTuple
工作,例如HashMap
,HashSet
等