【问题标题】:Java Comparable object equals() and compareTo() returning different results [duplicate]Java Comparable对象equals()和compareTo()返回不同的结果[重复]
【发布时间】:2016-11-05 11:58:18
【问题描述】:

在这个例子中我有一个实现ComparableEmployee类,下面是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 但它返回false。

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

请帮助我了解Comparable 的性质。谢谢!

【问题讨论】:

  • 你的equals是什么样的?
  • 如何在不显示 equals 方法的情况下提出这个问题?

标签: java comparable


【解决方案1】:

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

您的compareTo 方法与自身一致也很重要——换句话说,Math.signum(a.compareTo(b)) = -Math.signum(b.compareTo(a))。在您的情况下,两名姓名不同且工资相同的员工将始终返回 1,这意味着这两名员工在排序时应该依次出现(这没有意义)。

【讨论】:

  • 很好地指出了compareTo() 实现中的额外问题。
【解决方案2】:

compareToequals 方法从 JVM 的角度来看是完全不相关的。制作natural order consistent with equals是程序员的职责。

如果只为类Employee 提供compareTo 方法,则继承自Object 的默认实现。您应该重写equals 方法(连同hasCode)以获得一致的结果。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 2023-03-17
      • 2021-11-01
      • 2011-10-06
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多