覆盖java7中的compareTo和Compare

时间:2014-01-10 02:01:00

标签: java java-7

当我覆盖java中的CompareTo和Compare方法时,是否需要覆盖equals()方法才能满足Comparable合约?当我执行Collections.sort或Array.sort时,这会产生任何问题吗?

2 个答案:

答案 0 :(得分:2)

来自Comparator

的Javadoc
  

通常情况如此,但并非严格要求(compare(x,y)== 0)==(x.equals(y))。一般来说,任何违反此条件的比较器都应清楚地表明这一事实。推荐的语言是"注意:这个比较器强制排序与equals不一致。"

这意味着您通常不需要覆盖equals()。您可能不应该这样做,除非您希望Comparator为与true相比返回equals的两个值返回非零比较。

如果你认为比较的存在要求你改变两个事物平等意义的定义,那么你可能设计得很糟糕。

答案 1 :(得分:1)

来自Comparable

  

C的自然顺序被认为与equals一致,当且仅当e1.compareTo(e2) == 0e1.equals(e2)具有相同的布尔值时e1和{班级e2的{​​1}}。请注意,C不是任何类的实例,即使null返回e.compareTo(null)NullPointerException也应该抛出e.equals(null)

     

强烈建议(尽管不要求)自然排序与等于一致。这是因为没有显式比较器的有序集(和有序映射)在与自然顺序与equals不一致的元素(或键)一起使用时表现得“奇怪”。特别是,这样的有序集(或有序映射)违反了集合(或映射)的一般契约,它是根据等于方法定义的。

(强调我的)

所以你不需要来覆盖false(即它不会在标准排序方法中引起问题,因为它们只使用equals(),也不会违反compareTo())的合同,但肯定不会受到伤害。