Java 可比较对象 equals() 和 compareTo() 返回不同的结果

Java Comparable object equals() and compareTo() returning different results

在这个例子中,我有一个 Employee class 实现 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.equals(employee2); 时,鉴于 employee1 和 2 具有相同的名称,我希望结果为 true 但它 returns false.

但是当我这样做时 employee1.compareTo(employee2); 我得到了预期的结果,即 0

请帮我理解Comparable的本质。谢谢!

compareToequals 方法从 JVM 的角度来看是完全不相关的。使 natural order consistent with equals.

是程序员的职责

如果只为 class Employee 提供 compareTo 方法,则继承自 Object 的默认实现。您应该覆盖 equals 方法(与 hasCode 一起)以获得一致的结果。

Comparable 的重点是回答“如果我要按顺序排列这些东西(在本例中为 Employees),我怎么知道一个是否应该在在另一个前面还是后面?这意味着 必须 您正在签入 compareTo 的字段与您正在签入 equals 的字段完全相同.这有助于使这两者保持一致。

您的 compareTo 方法与自身一致也很重要 - 换句话说,Math.signum(a.compareTo(b)) = -Math.signum(b.compareTo(a))。在你的例子中,两名姓名不同但工资相同的员工总是 return 1,这意味着这两名员工在排序时应该排在彼此之后(这没有意义)。

您需要在 Employee 中提供 equals 方法(将比较名称)的实现,否则 Java 使用引用相等性检查,因此两个同名对象不相等。