【问题标题】:Overriding equals() and hashCode() in Java [duplicate]在 Java 中覆盖 equals() 和 hashCode() [重复]
【发布时间】:2011-04-24 13:49:56
【问题描述】:

可能重复:
Overriding equals and hashCode in Java

全部,

我已经定义了我的类以及覆盖equals() 和hashCode() 方法的类。但我不知道应该为我自己的类具体实现这些方法。任何人都可以对自定义类的这些方法的实现有所了解吗?

【问题讨论】:

  • 这实际上取决于您如何定义平等。通常需要考虑所有或几乎所有属性,有时只需要一个/几个,有时(例如考虑线程),您在 equals() 方法中想要的只是比较身份。

标签: java


【解决方案1】:

【讨论】:

  • 此答案是指向 IBM 页面的链接,该页面返回 503 页面。您认为您可以更新您的答案以包含相关信息,而不仅仅是一个链接吗?
  • @MichaelT 此链接仍然有效....
【解决方案2】:

对于 equals,答案取决于您的业务需求是什么,即对象相等意味着什么。

hashCode() 应该始终为一个对象返回一个唯一值,除非该对象等于另一个对象。它应该取决于对象的属性值。

【讨论】:

  • 最重要的是,hashCode() 必须不为 equals() 返回 true 的对象返回不同的值
  • @michael 好点,编辑答案..
  • 它不能总是返回一个唯一的值。最简单的方法是让它依赖与equals 相同的属性。
  • 你只能有 2^32 个不同的哈希码,但我可以想到更多不同的字符串。他们不可能所有都有唯一 hashCodes。
【解决方案3】:

基本上,如果您想将对象存储在集合(Map、Set、List)中,那么您必须根据文档中定义的约定实现 equals 和 hashCode 方法。

否则,许多集合实现不会有预期的行为。有关实现线索,请阅读 equals 和 hashcode 的 Object Javadoc。

【讨论】:

【解决方案4】:

阅读java.lang.Object中两种方法的API文档。它非常准确地描述了重写实现应该如何表现。

【讨论】:

    【解决方案5】:

    在实现 equals() 时,请确保您了解相等和身份之间的区别。 两个对象实例可能“相等”但可能不相同。 a.equals(b) 是对相等性的测试,您的业务规则应该定义它。 == 是对对象身份的测试(相同的对象实例)

    【讨论】:

      【解决方案6】:

      您说您已经知道您的哪个自定义类需要覆盖 hashCode/equals?然后您还知道哪些属性(全局变量)决定了每个类的相等性。

      当您知道这些属性后,您可以手动实现 hashCode/equals,也可以使用现代 IDE(如 Eclipse、NetBeans 等)生成方法。在 Eclipse 中有一个名为“Generate hashCode() and equals()”的选项“来源”菜单

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多