2011-08-07 14 views
23

如果我为某个类实现java.lang.Comparable,还需要覆盖equals()方法吗?或者Comparable也可以用于equalsjava.lang.Comparable且等于

如果答案是,那么如果出现一些差异呢?假设我在equals()方法中将两个对象称为相等的方式与我在ComparablecompareTo()范围内称两个相同类的对象的方式不同。

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

回答

26

虽然建议(和相当合理的),其具有a.compareTo(b) == 0暗示a.equals(b)(并且反之亦然),它是不需要Comparable用于在对一系列对象执行排序时使用,而equals()仅用于测试直线相等。

This link关于正确实施compareTo有一些很好的信息。

+0

+1下面是相关的有效Java的章节(见第11项)的链接http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf – MByD

+0

@MByD感谢您的链接。它(毫不意外)说比我更好! – dlev

+0

@MbyD感谢您的链接。打电话可以吗?compareTo(b)或compare()直接? – aps

7

java.lang.Comparable的Javadoc:

强烈推荐(虽然不是必需的)使自然排序与equals一致。

0

比方说,我称之为两个对象的平等享有平等()的方式 方法是从我称之为同一类 的两个对象的方式不同在Comparable的toCompare()内相等吗?

如果你这样做,你把这些对象为有序set,该集将胡作非为。 From the docs on SortedSet

注意,如果 有序set要正确实现Set接口,则有序集(无论是否提供了明确的 比较器)保持的顺序必须与equals一致。

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

a.compareTo(b) != 0 

a.equals(b) == true 
+1

所有的'TreeSet'操作都使用'compareTo'来执行 - 所以比较返回'!= 0'的对象被认为是不同的,并且比较返回'== 0'的对象是相同的(因此只有第一个被添加到该集合实际上保留)。正如Javadoc所说的那样:“即使排序与等号不一致,排序集的行为也是明确定义的;它只是不服从Set接口的总体合同 –

相关问题