Trn*_*nKh 3 java equals hashcode
我目前面临的情况是我有String元组(大小为2),如果它们至少有一个共同的元素,则应该认为两个元组是相等的.我有以下课程实现这个想法:
public class MyTuple
{
private List<String> list = Arrays.asList(new String[2]);
public List<String> 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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,根据hashCode()合同:
如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode()方法必须生成相同的整数结果.
如何覆盖我的hashCode()方法不违反合同?
在考虑之前hashCode(),我认为你应该首先重新考虑你的设计equals().我认为你不能实施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:
其中x1,x2,x3,x4是完全不同的.我现在有
他们违反了关于及物性的合同.
我认为你应该考虑使用你自己的另一种关系(也许partialEquals()),这样你就不必遵守合同了.但你也不能使用类似的方法equals(),并希望MyTuple工作,例如HashMap,HashSet等