java.lang.Comparable和equals

时间:2011-08-07 05:13:24

标签: java equals comparable

如果我为某个类实现java.lang.Comparable,是否仍然必须覆盖equals()方法?或者Comparable也适用于equals吗?

如果答案是,那么如果出现一些差异怎么办?假设我在equals()方法中将两个对象视为相等的方式与我在compareTo()的{​​{1}}中将同一类的两个对象视为相等的方式不同。

此外,如果我实施Comparable,我是否还必须覆盖Comparable

4 个答案:

答案 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