如果我java.lang.Comparable
为一个类实现,我还需要重写该equals()
方法吗?或者Comparable
工作equals
也一样?
如果答案是否定的,那么如果出现一些差异怎么办?假设我在方法中将两个对象称为相等的equals()
方式与我将同一类的两个对象compareTo()
在Comparable
.
此外,如果我实施Comparable
,我是否也必须覆盖equals()
?
如果我java.lang.Comparable
为一个类实现,我还需要重写该equals()
方法吗?或者Comparable
工作equals
也一样?
如果答案是否定的,那么如果出现一些差异怎么办?假设我在方法中将两个对象称为相等的equals()
方式与我将同一类的两个对象compareTo()
在Comparable
.
此外,如果我实施Comparable
,我是否也必须覆盖equals()
?
虽然建议(并且非常明智)a.compareTo(b) == 0
暗示a.equals(b)
(反之亦然),但这不是必需的。Comparable
旨在对一系列对象执行排序时使用,而equals()
只是测试直接相等。
这个链接有一些关于正确实施的好信息compareTo
。
来自java.lang.Comparable的 Javadoc :
强烈建议(尽管不是必需的)自然排序与 equals 一致。
虽然建议这样做,但它不是必需的.equals()
并且.compareTo()
具有相同的行为。
只需查看BigDecimal Docs for equals() 方法:
与 compareTo 不同,此方法仅当两个 BigDecimal 对象的值和比例相等时才认为它们相等(因此,通过此方法进行比较时,2.0 不等于 2.00)。
BigDecimal 是 Java 的一个核心类,它对 and 具有不同的行为,equals()
并且compareTo()
可以作为一个很好的例子来说明 2 个可比较的对象与真正相等的对象之间的差异。
假设我在 equals() 方法中将两个对象称为相等的方式与我在 Comparable 的 toCompare() 中将同一类的两个对象称为相等的方式不同?
如果你这样做,并且你将这些对象放入一个有序的集合中,那么这个集合就会出现异常。来自 SortedSet 上的文档:
请注意,如果有序集合要正确实现 Set 接口,则由有序集合维护的排序(无论是否提供显式比较器)必须与 equals 一致。
例如,一个TreeSet可能(错误地)包含两个对象,其中
a.compareTo(b) != 0
虽然
a.equals(b) == true