如果我为某个类实现java.lang.Comparable
,是否仍然必须覆盖equals()
方法?或者Comparable
也适用于equals
吗?
如果答案是否,那么如果出现一些差异怎么办?假设我在equals()
方法中将两个对象视为相等的方式与我在compareTo()
的{{1}}中将同一类的两个对象视为相等的方式不同。
此外,如果我实施Comparable
,我是否还必须覆盖Comparable
?
答案 0 :(得分:28)
虽然建议(并且非常明智)让a.compareTo(b) == 0
暗示a.equals(b)
(反之亦然),但不是必需的。 Comparable
旨在在对一系列对象执行排序时使用,而equals()
仅测试直接相等。
This link提供了有关正确实施compareTo
的一些信息。
答案 1 :(得分:7)
来自java.lang.Comparable的Javadoc:
强烈建议(尽管不要求)自然排序与等于一致。
答案 2 :(得分:5)
虽然建议使用,.equals()
和.compareTo()
不需要具有相同的行为。
只需查看BigDecimal API:http://download.oracle.com/javase/1,5.0/docs/api/java/math/BigDecimal.html#equals(java.lang.Object)
答案 3 :(得分:1)
让我们说一下我在equals()中将两个对象称为相等的方式 方法不同于我称同一个类的两个对象的方式 在Comparable的toCompare()中是否相等?
如果您执行此操作,并将这些对象放入有序集,则该集将行为异常。 From the docs on SortedSet:
请注意由排序集维护的排序(无论是否为 提供显式比较器)如果必须与equals一致 sorted set是为了正确实现Set接口。
例如,TreeSet可能(错误地)包含两个对象
a.compareTo(b) != 0
即使
a.equals(b) == true