Java Comparable对象equals()和compareTo()返回不同的结果

时间:2016-11-05 11:58:19

标签: java comparable

在此示例中,我有一个实现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的性质。谢谢!

2 个答案:

答案 0 :(得分:3)

Comparable的要点是回答问题“如果我按顺序放置这些东西(在这种情况下,Employee s),我怎么知道是否应该在...之前或者在另一个之后?这意味着必要您在compareTo中检查的字段与您在equals中检查的字段完全相同。这有助于这两者一致。

您的compareTo方法与自身一致也很重要 - 换句话说,Math.signum(a.compareTo(b)) = -Math.signum(b.compareTo(a))。在您的情况下,具有不同名称和相同薪酬的两名员工将始终返回1,这意味着这两名员工在进行排序时应该相互追随(这没有意义)。

答案 1 :(得分:1)

从JVM的角度来看,

compareToequals方法完全不相关。制定natural order consistent with equals是程序员的职责。

如果仅为类compareTo提供Employee方法,则继承从Object派生的默认实现。您应该覆盖equals方法(与hasCode一起使用)以获得一致的结果。