等于具有可比接口的方法合同

Kar*_*G C 1 java collections equals comparable

我有像Person这样的自定义类:

public class Person {
    int age;
    String name;
}
Run Code Online (Sandbox Code Playgroud)

现在我想Person基于类对对象进行排序age.

所以我将使用Comparable接口和实现compareTo()方法.

而且compareTo会有基于刚才比较人物对象的逻辑age.

所以,如果我这样做:

Collections.sort(list);  // where list is a list of person
Run Code Online (Sandbox Code Playgroud)

我会基于的获得排序人名单age.

但我在某处读到,我们equals()Comparable执行时也需要覆盖方法.

但我现在还没有看到它的使用.

任何人都可以解释一下,equals()如果我想sort基于age什么,还需要覆盖方法?

Ale*_*exR 7

没有法律涉及Comparable.compareTo()equals().但是我会说,如果compaeTo()返回0equals()返回会令人困惑false.

我认为在你的情况下你应该使用自定义比较器而不是你的类Comparable.原因是今天你的比较标准是年龄,明天它将是人的名字,然后是姓氏,然后是权重......等等.这就是Comparator引入的原因以及应该使用它的用例.


ajb*_*ajb 6

从javadoc Comparable:

强烈建议(尽管不要求)自然排序[即由...定义的排序Comparable.compareTo]与equals一致.这是因为没有显式比较器的有序集(和有序映射)在与自然顺序与equals不一致的元素(或键)一起使用时表现得"奇怪".特别是,这样的有序集(或有序映射)违反了集合(或映射)的一般契约,它是根据等于方法定义的.

"与equals一致"意味着compareTo当且仅当equals返回时返回0 true.因此,除非compareTo始终返回!= 0两个不同对象引用的值,否则equals应该重写.


Anu*_*oob 5

你不需要重写equals,因为Collections.sort()将使用compareTo(),而不是equals().但是,覆盖它通常是一个好主意.