当我覆盖java中的CompareTo和Compare方法时,是否需要覆盖equals()方法才能满足Comparable合约?当我执行Collections.sort或Array.sort时,这会产生任何问题吗?
答案 0 :(得分:2)
来自Comparator
通常情况如此,但并非严格要求(compare(x,y)== 0)==(x.equals(y))。一般来说,任何违反此条件的比较器都应清楚地表明这一事实。推荐的语言是"注意:这个比较器强制排序与equals不一致。"
这意味着您通常不需要覆盖equals()
。您可能不应该这样做,除非您希望Comparator
为与true
相比返回equals
的两个值返回非零比较。
如果你认为比较的存在要求你改变两个事物平等意义的定义,那么你可能设计得很糟糕。
答案 1 :(得分:1)
来自Comparable
:
类
C
的自然顺序被认为与equals一致,当且仅当e1.compareTo(e2) == 0
与e1.equals(e2)
具有相同的布尔值时e1
和{班级e2
的{1}}。请注意,C
不是任何类的实例,即使null
返回e.compareTo(null)
,NullPointerException
也应该抛出e.equals(null)
。强烈建议(尽管不要求)自然排序与等于一致。这是因为没有显式比较器的有序集(和有序映射)在与自然顺序与equals不一致的元素(或键)一起使用时表现得“奇怪”。特别是,这样的有序集(或有序映射)违反了集合(或映射)的一般契约,它是根据等于方法定义的。
(强调我的)
所以你不需要来覆盖false
(即它不会在标准排序方法中引起问题,因为它们只使用equals()
,也不会违反compareTo()
)的合同,但肯定不会受到伤害。