我们正在编写一个需要非常复杂逻辑计算equals()和hashCode()的类。其大致如下:
@Getters @Setters @FieldDefaults(level=AccessLevel.PRIVATE)
public class ExternalData {
TypeEnum type;
String data;
List<ExternalData> children;
}
我们不构建这些对象,它们是从外部复杂系统的XML反序列化而来。根据类型不同,可能会忽略数据,或者处理带有子节点的数据,或者处理没有子节点的数据,每种节点类型的数据比较取决于该节点类型。我们创建了equals()和hashCode()方法以反映所有这些规则,但最近遇到了一个问题,hashCode与equals不同步导致相等的对象被添加两次到HashSet中。我认为HashMap(以及Java中的HashSet)是这样实现的:https://en.wikipedia.org/wiki/Hash_table。实现首先基于hashCode将对象放入桶中,然后对于每个桶检查equals。在不幸的情况下,即两个相等的对象将进入不同的桶中,它们永远不会通过equals()进行比较。在这里,“不同步”意味着它们进入了不同的桶中。如何确保equals和hashCode不失同步?编辑:此问题与Java中覆盖equals和hashCode时应考虑哪些问题?不同。那里他们询问通用指导方针,接受的答案不适用于我的情况。他们说“使equals和hashCode一致”,这里我正在询问如何确切地做到这一点。
hashCode
的官方文档表明,不相等的对象可能具有相同的hashCode
。 - dorukayhanLong
类。有2^64个可能的Long
对象,但只有2^32个可能的哈希码。根据鸽笼原理,许多不相等的Long
对象必须具有相同的哈希码。 - David Conrad