如果我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