我知道如果一个覆盖equals,hashCode也应该被覆盖。是否有任何类似的规则适用于覆盖compareTo?
这是一个Java问题。
答案 0 :(得分:3)
可以在此处阅读它的期望:http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
您最感兴趣的部分可能是:
强烈建议(尽管不要求)自然 排序与平等一致。这是因为排序集 没有显式比较器的(和排序的地图)表现得“奇怪” 它们与自然顺序的元素(或键)一起使用 与equals不一致。特别是,这样的排序集(或排序的 map)违反了定义的集合(或映射)的一般合同 就平等方法而言。
答案 1 :(得分:0)
当且仅当
的C
与e1.compareTo(e2) == 0
具有与e1.equals(e2)
相同的布尔值时,类e1
的自然顺序被称为与等于一致类e2
C
和compareTo()
请注意,它不是必需,即如果两个类根据equals()
相等,则不必保留Comparator<Person>
。这很好,因为你可以按年龄对人进行排序,因此对于compareTo()
,两个年龄相同的人被认为是平等的,但他们显然不一定相等。
然而,在这种特殊情况下,如果年龄相等,您可能希望将辅助属性添加到比较器(因此排序总是稳定且可以在同龄人中预测),所以在{{1}}中包含相同的属性后可能会在某些情况下是一个好主意。
答案 2 :(得分:0)
Comparator
的文档有这个注意事项:
当且仅当c.compare(e1,e2)== 0具有与e1.equals(e2)相同的布尔值时,比较器c对一组元素S施加的排序被认为与equals一致。对于S中的每个e1和e2。
当使用能够强加与equals不一致的排序的比较器来排序有序集(或有序映射)时,应该小心。假设带有显式比较器c的有序集(或有序映射)与从集合S中绘制的元素(或键)一起使用。如果由S对S施加的排序与equals不一致,则排序集(或有序映射)将表现得“奇怪”。特别是有序集(或有序映射)将违反集合(或映射)的一般契约,它以等于的方式定义。
答案 3 :(得分:0)
我想告诉您,您应该在对象中使用特定属性或属性来比较两个相同类型的对象。