28

如果我java.lang.Comparable为一个类实现,我还需要重写该equals()方法吗?或者Comparable工作equals也一样?

如果答案是否定的,那么如果出现一些差异怎么办?假设我在方法中将两个对象称为相等的equals()方式与我将同一类的两个对象compareTo()Comparable.

此外,如果我实施Comparable,我是否也必须覆盖equals()

4

4 回答 4

30

虽然建议(并且非常明智)a.compareTo(b) == 0暗示a.equals(b)(反之亦然),但这不是必需的。Comparable旨在对一系列对象执行排序时使用,而equals()只是测试直接相等。

这个链接有一些关于正确实施的好信息compareTo

于 2011-08-07T05:17:52.860 回答
8

来自java.lang.Comparable的 Javadoc :

强烈建议(尽管不是必需的)自然排序与 equals 一致。

于 2011-08-07T05:20:12.717 回答
5

虽然建议这样做,但它不是必需的.equals()并且.compareTo()具有相同的行为。

只需查看BigDecimal Docs for equals() 方法

与 compareTo 不同,此方法仅当两个 BigDecimal 对象的值和比例相等时才认为它们相等(因此,通过此方法进行比较时,2.0 不等于 2.00)。

BigDecimal 是 Java 的一个核心类,它对 and 具有不同的行为,equals()并且compareTo()可以作为一个很好的例子来说明 2 个可比较的对象与真正相等的对象之间的差异。

于 2011-08-07T05:21:59.847 回答
1

假设我在 equals() 方法中将两个对象称为相等的方式与我在 Comparable 的 toCompare() 中将同一类的两个对象称为相等的方式不同?

如果你这样做,并且你将这些对象放入一个有序的集合中,那么这个集合就会出现异常。来自 SortedSet 上的文档

请注意,如果有序集合要正确实现 Set 接口,则由有序集合维护的排序(无论是否提供显式比较器)必须与 equals 一致。

例如,一个TreeSet可能(错误地)包含两个对象,其中

a.compareTo(b) != 0

虽然

a.equals(b) == true
于 2013-06-22T09:05:35.503 回答