我知道如果一个覆盖等于,hashCode 也应该被覆盖。是否有任何类似的规则适用于覆盖 compareTo?
这是一个Java问题。
它的期望可以在这里阅读:http: //docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
您最感兴趣的部分可能是:
强烈建议(尽管不是必需的)自然排序与 equals 一致。之所以如此,是因为没有显式比较器的排序集(和排序映射)在与自然顺序与等于不一致的元素(或键)一起使用时表现“奇怪”。特别是,这样的排序集合(或排序映射)违反了集合(或映射)的一般合同,该合同是根据 equals 方法定义的。
JavaDocs中对此进行了解释:
当且仅当具有与类的每个and相同的布尔值时,类的自然排序
C
被称为与 equals 一致e1.compareTo(e2) == 0
e1.equals(e2)
e1
e2
C
请注意,它不是必需的,即如果两个类根据 相等compareTo()
,则它们不必保持equals()
。这很好,因为您可以例如按年龄对人进行排序,因此两个年龄相同的人在 方面被认为是相等的Comparator<Person>
,但他们显然不必相等。
但是,在这种特殊情况下,如果年龄相等,您可能希望向比较器添加次要属性(因此排序在同龄人中始终是稳定且可预测的),因此compareTo()
在某些情况下,毕竟包含相同的属性可能是一个好主意。
的文档Comparator
有这个警告说明:
当且仅当 c.compare(e1, e2)==0 对于每个 e1 具有与 e1.equals(e2) 相同的布尔值时,比较器 c 对一组元素 S 施加的排序被称为与 equals 一致和 S 中的 e2。
当使用能够施加与等于不一致的排序的比较器来对排序集(或排序映射)进行排序时,应谨慎行事。假设带有显式比较器 c 的有序集合(或有序映射)与从集合 S 中提取的元素(或键)一起使用。如果 c 对 S 施加的排序与 equals 不一致,则有序集合(或有序映射)将表现得“奇怪”。特别是有序集合(或有序映射)将违反集合(或映射)的一般合同,它是根据等式定义的。
我只想告诉您,您应该在对象中具有特定的属性或属性,您将使用它来比较相同类型的两个对象。