【问题标题】:Should we always override equals?我们应该总是覆盖equals吗?
【发布时间】:2009-10-11 01:14:21
【问题描述】:

在编写自己的类时,是否总是需要覆盖equals(Object o)

如果我不这样做,它会自动检查所有字段是否相同?还是只是检查两个变量是否指向同一个对象?

【问题讨论】:

    标签: java inheritance comparison equals


    【解决方案1】:

    只有在有意义的情况下才覆盖equals()。但很明显,如果你覆盖 equals(),你需要确保 hashcode() 合约没有被破坏,这意味着如果两个对象相等,它们必须具有相同的哈希码。

    什么时候有意义?当Object.equals() 不足时。该方法基本上归结为引用标识,这意味着两个对象是同一个对象:

    a.equals(b) iff q == b
    

    数字是一个明显的例子,因为Integer(10) 应该等于另一个Intger(10)

    另一个例子是当您表示数据库记录时。假设您有具有唯一整数 ID 的学生记录,那么 可能 就足以实现 equals 来简单地比较 ID 字段。

    【讨论】:

      【解决方案2】:

      Object 类的 equals 方法实现了对象上最有区别的可能等价关系;也就是说,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象(x == y 的值为 true)时,此方法才返回 true。

      要测试两个对象在等价意义上是否相等(包含相同的信息),您必须重写 equals() 方法。如果标识运算符不适合您的类,则应始终重写 equals() 方法.

      请注意,通常需要在任何时候重写 hashCode 方法,以维护 hashCode 方法的一般约定,即相等的对象必须具有相等的哈希码。

      【讨论】:

        【解决方案3】:

        如果要编写一个类以某种方式对其对象进行比较,那么应该重写 equalshashCode 方法。

        不提供显式的equals 方法将导致从超类继承equals 方法的行为,如果超类是Object 类,那么它将是在Object 类的 Java API 规范。

        提供equals 方法的一般合同可以在Object 类的文档中找到,特别是equalshashCode 方法的文档。

        【讨论】:

          【解决方案4】:

          虽然您不应该依赖 IDE,但 Eclipse 通过按 alt + shift + s 并选择 equals 和 hashCode 菜单选项来提供这种固定功能。还有一个 toString 选项。 Josh Bloch 的Effective Java 对此主题有很好的信息。该链接会将您带到 Google 图书上讨论此主题的章节。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-05-23
            • 2011-07-11
            • 1970-01-01
            • 1970-01-01
            • 2014-01-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多