“等于某些字段中的任何一个都相等”的 hashCode 实现

Jay*_*ayK 5 java equals hashcode

如果它们的字段之一相等,我希望特定类的对象相等。如何为这样的类编写一致的 hashCode 方法?

(免责声明,因为我知道这不是最佳实践:该类是另一个类的包装器,应该用于 Maps 中的键。这两个不同的具有相同字段的对象将导致相同的 Map 条目。实际上每个字段都会自行识别底层对象,但我并不总是为两个可用对象提供相同的识别字段。我无法控制并因此更改这种“模棱两可”的识别机制。解决这个问题的替代解决方案也是受欢迎的。)

是否有相应的实施 hashCode() 的策略?我只知道在 equals 中涉及连接(如 &&)的实现。如果任何一个字段相等,如何确保 hashCode() 相同?

这是简化的 equals 方法,我想为其编写一致的 hashCode() 实现:

public boolean equals(C other)
{
    return (field1 != null && field1.equals(other.field1))
            || (field2 != null && field2.equals(other.field2))
            || (field3 != null && field3.equals(other.field3));
}
Run Code Online (Sandbox Code Playgroud)

编辑:根据输入数据,不会出现 (1, 2, 3) 等于 (1, 6, 7) 的情况。生成的对象仅使得某些字段可以为空,但不会像示例中那样自相矛盾。简单地说,实际上等于 (1, 2, 3) 的唯一组合应该是 (1, 2, 3), (1, null, null), (null, 2, null), (1, 2, null) 和等等。我承认这种方法不是特别可靠。

ha9*_*3ar 1

您通常不会只实现equals()和hashCode()使用对象类的一个字段。每个人可能都会建议你反对。一般做法是确保比较所有字段并确保它们都相等才能调用.equals()。hashCode()用于.equals()散列这些对象。但是,如果您可以控制正在执行的操作,则可以简单地使用hashCode()对象的特定字段并覆盖 .equals() 并.hashCode()基于此(但同样,不建议)。