21

可能重复:
Java:总是覆盖等于?

equals我应该为我创建的任何类覆盖函数吗?

即使对于只包含一些非常简单的属性的非常简单的类, 我需要它的每个属性都相等吗

4

3 回答 3

32

我应该为我创建的任何类覆盖 equals 函数吗?

当(且仅当)对象“表示某些数据”时覆盖equals,即如果它对诸如PersonCarRecipieIngredient(这些通常以集合等结尾)之类的东西建模。不要为其他类型的类覆盖 equals,例如LoginServletor DatabaseUtil

hashCode请记住在您覆盖时始终覆盖equals

(一个自然的后续问题:)如果我不覆盖 equals 和 hashCode 会发生什么?

任何两个对象都将被视为不相等,除非它们是完全相同的对象。

[...] 我需要它的每一个属性都相等吗?

通常的。这取决于如何定义平等概念。请注意,对于引用类型,您可以在实现自己的时重用/委托给(和)对象实现。equalshashCode

相关问题:

于 2012-06-13T08:08:29.970 回答
16

equals()只有当你有理由这样做时,你才应该覆盖。如此处所述,equals()为非最终类或可变类编写适当的方法非常困难。

如果您的应用程序需要某种不同于“相同对象”的相等概念,那么请务必继续。只需阅读上述参考资料即可了解所涉及的内容。但作为例行公事?当然不。

于 2012-06-13T08:14:49.907 回答
2

好吧,如果您在现实生活中考虑它,则更容易理解覆盖 equals() 的概念。

仅当两个对象需要在逻辑上相等时才应覆盖 Equals 方法。此外,如果您担心在程序中的某个地方可能会重新创建对象,那么您必须覆盖 equals()。

一个很好的例子是java中的String对象。

   String string1= new String("hello");

   String string2= "hello";

他们是平等的吗?……是的,他们绝对是……但从逻辑上讲。您只能检查它们的相等性,因为 Java 已经覆盖了 String equals() 方法。

众所周知,类实际上是其对象的模板。所以让我们考虑一下,有一个员工类,它实际上决定了公司中的员工可以拥有哪些属性,而公司中的实际员工是这个类的对象。因此,通常,员工的属性可能如下。

1.员工姓名

2.员工证

3.出生日期。. . ... . . . . .

因此,在这种情况下,您应该只在 equals 方法中检查员工 ID 是否相等。但是,是的,如果您的对象缺少这种不同的属性,那么您应该继续检查几乎所有的值,以避免让您的程序认为两个不同的人相等。

于 2012-06-13T09:29:07.033 回答