可能重复:
Java:总是覆盖等于?
equals
我应该为我创建的任何类覆盖函数吗?
即使对于只包含一些非常简单的属性的非常简单的类, 我需要它的每个属性都相等吗?
我应该为我创建的任何类覆盖 equals 函数吗?
当(且仅当)对象“表示某些数据”时覆盖equals
,即如果它对诸如Person
、Car
或RecipieIngredient
(这些通常以集合等结尾)之类的东西建模。不要为其他类型的类覆盖 equals,例如LoginServlet
or DatabaseUtil
。
hashCode
请记住在您覆盖时始终覆盖equals
。
(一个自然的后续问题:)如果我不覆盖 equals 和 hashCode 会发生什么?
任何两个对象都将被视为不相等,除非它们是完全相同的对象。
[...] 我需要它的每一个属性都相等吗?
通常是的。这取决于您如何定义平等概念。请注意,对于引用类型,您可以在实现自己的时重用/委托给(和)的对象实现。equals
hashCode
相关问题:
equals()
只有当你有理由这样做时,你才应该覆盖。如此处所述,equals()
为非最终类或可变类编写适当的方法非常困难。
如果您的应用程序需要某种不同于“相同对象”的相等概念,那么请务必继续。只需阅读上述参考资料即可了解所涉及的内容。但作为例行公事?当然不。
好吧,如果您在现实生活中考虑它,则更容易理解覆盖 equals() 的概念。
仅当两个对象需要在逻辑上相等时才应覆盖 Equals 方法。此外,如果您担心在程序中的某个地方可能会重新创建对象,那么您必须覆盖 equals()。
一个很好的例子是java中的String对象。
String string1= new String("hello");
String string2= "hello";
他们是平等的吗?……是的,他们绝对是……但从逻辑上讲。您只能检查它们的相等性,因为 Java 已经覆盖了 String equals() 方法。
众所周知,类实际上是其对象的模板。所以让我们考虑一下,有一个员工类,它实际上决定了公司中的员工可以拥有哪些属性,而公司中的实际员工是这个类的对象。因此,通常,员工的属性可能如下。
1.员工姓名
2.员工证
3.出生日期。. . ... . . . . .
因此,在这种情况下,您应该只在 equals 方法中检查员工 ID 是否相等。但是,是的,如果您的对象缺少这种不同的属性,那么您应该继续检查几乎所有的值,以避免让您的程序认为两个不同的人相等。