0

当我们比较单个Collection对象中的元素时,我们是否总是需要覆盖equals方法?如果是,我们为什么要这样做。

实际上,我们通过CompareTo整数方法将元素1,0,-1与它们的返回类型进行比较。

4

7 回答 7

2

如果使用集合,Java 将使用该equals()方法来比较对象。如果您使用的是排序集合,则Comparable必须实现该接口。

默认情况下,equals()如果两个对象实例相同,则为 true,如果要在比较中实现更多逻辑,则必须实现给定方法。

于 2012-06-25T07:54:32.200 回答
1

如果您不覆盖类中的 equals 方法,java.lang.Object则将调用超类的(通常是 )方法。如果这是您想要的,那么您不需要覆盖equals.

现在,Object.equals() 所做的可能不是您想要的:

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

例如,Integer确实覆盖了 equals 方法,所以这有效:

Integer a = new Integer(3);
Integer b = new Integer(3);
assert(a.equals(b)); //Succeeds

如果不是,那么 a 将不等于 b(根据 Object.equals)。所以,这取决于你需要做什么。大多数 Java 标准类已经有一个适当的 equals 方法,您不需要重写它。但是,您的自定义类将默认为 Object.equals() ,它将检查对象是否是相同的对象(相同的实例,内存中的相同字节串),这通常不是您想要的。

另外,请注意 HashMap 不会使用 equals 进行比较,而是使用 hashCode,例如 TreeSet 将使用Comparable接口方法。通常,如果您覆盖equals,请不要忘记同时覆盖hashCode(如果您愿意,Eclipse 有很好的自动生成选项)。

于 2012-06-25T08:00:45.703 回答
1

确实需要重写 equals 方法以便进行更复杂的比较,然后只检查两个实例是否相同。

假设您有一个 Person 类,并且您希望具有相同社会安全号码的 Person 彼此“相等”。那么一个简单的实现可能如下所示:

public boolean equals(Object obj) {
    if (this.getSocialSecurityNumber() == obj.getSocialSecurityNumber())
       return true;
    else
       return false;
}

这将导致每个 Person 对象“相等”,因为它们具有相同的社会安全号码。请注意,除非您想要特定的行为,否则覆盖 equals 不是必需的,例如此示例

于 2012-06-25T08:06:23.610 回答
1

当我们比较单个集合对象中的元素时,我们是否总是需要覆盖 equals 方法?

不。在一般情况下,不必覆盖。equals(Object)对于您的特定应用程序,覆盖等于(和哈希码)可能是合适的/必要的,但这取决于该方法的非覆盖版本的作用以及您的应用程序需要什么行为。

实际上,我们通过 CompareTo 方法将整数作为 1,0,-1 与它们的返回类型进行比较。

如果您使用的 Collection 类使用compareToorcompare而不是,那么您显然equals不必覆盖。但是,类和方法保持一致是一种很好的做法。未来的开发人员可能会认为它们是一致的,但实际上却不一致。(当然,不一致可能有务实的原因......但你不应该因为懒惰而让方法不一致。)equalsequalscompareTo

于 2012-06-25T08:06:33.273 回答
1

好吧,如果你已经实现了 compareTo() 方法,那么你就不需要再实现 equals() 了,因为 compareTo() 本身会检查相等性。

即使您已经单独实现了 equals(),compareTo() 也会隐藏其实现,并且您的对象将永远不会针对 equals() 方法进行测试。

于 2012-06-25T08:15:35.187 回答
0

是的。我们总是需要重写equals方法。

例如。如果您在集合中添加null,我们不能使用compareTo,因为它会抛出NullPointerException。但是, equals() 不会抛出NullPointerException

重写 equals() 以避免 NullPointerException 更安全。

于 2012-06-25T08:07:39.897 回答
0

我想您正在谈论的是Comparable接口,强烈建议其实现与对象的equals()方法保持一致,但仍然不是必需的。 可比描述

于 2012-06-25T08:07:53.000 回答