在此示例中,我有一个实现Employee
的{{1}}类,以下是Comparable
的代码
compareTo()
当我@Override
public int compareTo(Employee e) {
if (getName().equals(e.getName())) return 0;
else if (getPay() < e.getPay()) return -1;
else return 1;
}
时,假设employee1和2具有相同的名称,我希望结果为employee1.equals(employee2);
,但它返回false。
但是当我true
时,我得到了预期的结果,即employee1.compareTo(employee2);
。
请帮助我了解0
的性质。谢谢!
答案 0 :(得分:3)
Comparable
的要点是回答问题“如果我按顺序放置这些东西(在这种情况下,Employee
s),我怎么知道是否应该在...之前或者在另一个之后?这意味着必要您在compareTo
中检查的字段与您在equals
中检查的字段完全相同。这有助于这两者一致。
您的compareTo
方法与自身一致也很重要 - 换句话说,Math.signum(a.compareTo(b)) = -Math.signum(b.compareTo(a))
。在您的情况下,具有不同名称和相同薪酬的两名员工将始终返回1,这意味着这两名员工在进行排序时应该相互追随(这没有意义)。
答案 1 :(得分:1)
compareTo
和equals
方法完全不相关。制定natural order consistent with equals是程序员的职责。
如果仅为类compareTo
提供Employee
方法,则继承从Object
派生的默认实现。您应该覆盖equals
方法(与hasCode
一起使用)以获得一致的结果。