如果我为某个类实现java.lang.Comparable
,还需要覆盖equals()
方法吗?或者Comparable
也可以用于equals
?java.lang.Comparable且等于
如果答案是否,那么如果出现一些差异呢?假设我在equals()
方法中将两个对象称为相等的方式与我在Comparable
的compareTo()
范围内称两个相同类的对象的方式不同。
此外,如果我执行Comparable
,我是否也必须覆盖equals()
?
如果我为某个类实现java.lang.Comparable
,还需要覆盖equals()
方法吗?或者Comparable
也可以用于equals
?java.lang.Comparable且等于
如果答案是否,那么如果出现一些差异呢?假设我在equals()
方法中将两个对象称为相等的方式与我在Comparable
的compareTo()
范围内称两个相同类的对象的方式不同。
此外,如果我执行Comparable
,我是否也必须覆盖equals()
?
虽然建议(和相当合理的),其具有a.compareTo(b) == 0
暗示a.equals(b)
(并且反之亦然),它是不需要。 Comparable
用于在对一系列对象执行排序时使用,而equals()
仅用于测试直线相等。
This link关于正确实施compareTo
有一些很好的信息。
从java.lang.Comparable的Javadoc:
强烈推荐(虽然不是必需的)使自然排序与equals一致。
虽然推荐使用,但.equals()
和.compareTo()
并不要求具有相同的行为。
试想一下,在BigDecimal的API:http://download.oracle.com/javase/1,5.0/docs/api/java/math/BigDecimal.html#equals(java.lang.Object)
比方说,我称之为两个对象的平等享有平等()的方式 方法是从我称之为同一类 的两个对象的方式不同在Comparable的toCompare()内相等吗?
如果你这样做,你把这些对象为有序set,该集将胡作非为。 From the docs on SortedSet:
注意,如果 有序set要正确实现Set接口,则有序集(无论是否提供了明确的 比较器)保持的顺序必须与equals一致。
例如,TreeSet可能(错误地)包含两个对象,其中即使
a.compareTo(b) != 0
a.equals(b) == true
所有的'TreeSet'操作都使用'compareTo'来执行 - 所以比较返回'!= 0'的对象被认为是不同的,并且比较返回'== 0'的对象是相同的(因此只有第一个被添加到该集合实际上保留)。正如Javadoc所说的那样:“即使排序与等号不一致,排序集的行为也是明确定义的;它只是不服从Set接口的总体合同 –
+1下面是相关的有效Java的章节(见第11项)的链接http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf – MByD
@MByD感谢您的链接。它(毫不意外)说比我更好! – dlev
@MbyD感谢您的链接。打电话可以吗?compareTo(b)或compare()直接? – aps