gpt4 book ai didi

java - 如何保证 equals() 和 hashCode() 是同步的?

转载 作者:IT老高 更新时间:2023-10-28 20:54:00 25 4
gpt4 key购买 nike

我们正在编写一个需要非常复杂的逻辑来计算 equals() 和 hashCode() 的类。类似的东西:

@Getters @Setters @FieldDefaults(level=AccessLevel.PRIVATE)
public class ExternalData {
TypeEnum type;
String data;
List<ExternalData> children;
}

我们不构造这些对象,它们是从外部复杂系统的 XML 反序列化的。有 20 多种类型,根据类型,可以忽略数据,或者使用子节点处理,或者不处理子节点,每种节点的数据比较取决于类型。

我们创建了 equals() 和 hashCode() 来反射(reflect)所有这些规则,但最近遇到了一个问题,即 hashCode 与 equals 不同步,导致相等的对象被两次添加到 HashSet。我相信 HashMap(以及 HashSet)在 Java 中是这样实现的:https://en.wikipedia.org/wiki/Hash_table该实现首先根据 hashCode 将对象放入桶中,然后为每个桶检查等于。在不幸的情况下,两个相等的对象将进入不同的桶,它们永远不会被 equals() 比较。这里的“不同步”是指它们进入不同的存储桶。

确保 equals 和 hashCode 不会不同步的最佳方法是什么?

编辑:这个问题不同于 What issues should be considered when overriding equals and hashCode in Java?他们在那里询问一般指导,而接受的答案不适用于我的情况。他们说“使 equals 和 hashCode 保持一致”,我在这里问我到底该怎么做。

最佳答案

Guava teSTLib 库有一个名为 EqualsTester 的类。可用于为您的 equals()hashCode() 实现编写测试。

添加测试既可以帮助您确保代码现在是正确的,也可以确保它在您将来修改它时保持正确。

关于java - 如何保证 equals() 和 hashCode() 是同步的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38174493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com