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
的本质。谢谢!
compareTo
和 equals
方法从 JVM 的角度来看是完全不相关的。使 natural order consistent with equals.
是程序员的职责
如果只为 class Employee
提供 compareTo
方法,则继承自 Object
的默认实现。您应该覆盖 equals
方法(与 hasCode
一起)以获得一致的结果。
Comparable
的重点是回答“如果我要按顺序排列这些东西(在本例中为 Employee
s),我怎么知道一个是否应该在在另一个前面还是后面?这意味着 必须 您正在签入 compareTo
的字段与您正在签入 equals
的字段完全相同.这有助于使这两者保持一致。
您的 compareTo
方法与自身一致也很重要 - 换句话说,Math.signum(a.compareTo(b)) = -Math.signum(b.compareTo(a))
。在你的例子中,两名姓名不同但工资相同的员工总是 return 1,这意味着这两名员工在排序时应该排在彼此之后(这没有意义)。
您需要在 Employee
中提供 equals 方法(将比较名称)的实现,否则 Java 使用引用相等性检查,因此两个同名对象不相等。
在这个例子中,我有一个 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
的本质。谢谢!
compareTo
和 equals
方法从 JVM 的角度来看是完全不相关的。使 natural order consistent with equals.
如果只为 class Employee
提供 compareTo
方法,则继承自 Object
的默认实现。您应该覆盖 equals
方法(与 hasCode
一起)以获得一致的结果。
Comparable
的重点是回答“如果我要按顺序排列这些东西(在本例中为 Employee
s),我怎么知道一个是否应该在在另一个前面还是后面?这意味着 必须 您正在签入 compareTo
的字段与您正在签入 equals
的字段完全相同.这有助于使这两者保持一致。
您的 compareTo
方法与自身一致也很重要 - 换句话说,Math.signum(a.compareTo(b)) = -Math.signum(b.compareTo(a))
。在你的例子中,两名姓名不同但工资相同的员工总是 return 1,这意味着这两名员工在排序时应该排在彼此之后(这没有意义)。
您需要在 Employee
中提供 equals 方法(将比较名称)的实现,否则 Java 使用引用相等性检查,因此两个同名对象不相等。