java.lang.Comparable和equals
如果我为类实现java.lang.Comparable
,我还是要重写equals()
方法吗? 或者Comparable
能equals
工作吗?
如果答案是否定的 ,那么如果出现一些差异怎么办? 假设我在equals()
方法中将两个对象称为相等的方式与我在compareTo()
中将两个相同类的对象称为相等的方式不同。
而且,如果我实现Comparable
,我还必须覆盖equals()
吗?
虽然建议(并且非常明智)使a.compareTo(b) == 0
暗示a.equals(b)
(反之亦然),但不是必需的。 Comparable
旨在用于对一系列对象执行排序时使用,而equals()
仅测试直接相等。
这个链接有一些关于正确实现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)
假设我在equals()方法中将两个对象称为相等的方式与在可比较的toCompare()中将同一类的两个对象称为相等的方式不同?
如果你这样做,并将这些对象放入一个有序的集合中 ,那么该集合将会出错。 从SortedSet上的文档 :
请注意,如果有序集合要正确实现Set接口,则由有序集合维护的排序(无论是否提供显式比较器)必须与equals一致。
例如, TreeSet可能(错误地)包含两个对象
a.compareTo(b) != 0
即使
a.equals(b) == true