我的 equals 方法有什么问题?

What is wrong with my equals method?

我正在写复数 class,但我的 equals 方法似乎不起作用。我应该检查两个 ComplexNum 对象是否彼此相等,但我总是遇到一个总是 returns false.

的逻辑错误
public boolean equals(Object x) {
    ComplexNum real = (ComplexNum) x;
    if (x == null)
        return false;
    if (x instanceof ComplexNum && this.imag == (real.real)) {
        return true;
    } else
        return false;
}

这是我的演示 class

ComplexNum y = new ComplexNum(3.0,15.0);
ComplexNum z = new ComplexNum(3.0,15.0);

    System.out.println(y.equals(z));

false < -- 无论值是什么,我的输出都是假的

您没有对复数的实部和虚部进行同类比较。

这将是我的实现:

public boolean equals(Object o) {
    if (o instanceof ComplexNum) {
        ComplexNum other = (ComplexNum)o;
        return (this.real == other.real) && (this.imag == other.imag);
    } else {
        return false;
    }
}

对于那些争论浮点比较永远不应该使用精确测试的人,恕我直言,应该使用另一种方法。 Java 要求 .equal() 的对象具有相同的 .hashCode(),这将 非常 很难用 epsilon 比较来安排。

由于以上原因,你也需要这个(其他实现也是可能的,下面假设你的组件是double

int hashCode() {
    return Double(this.real).hashCode() ^ Double(this.imag).hashCode();
}

注意:在 .equals() 中不需要测试 o == null,因为 null 而不是 instanceof ComplexNum

EDIT 完全严格 符合 .equals()Float 或 [=22 上的工作方式=] 类型(特别是对于 NaN 值),您可能想使用此行,它用 .equals()

的每个组件应用程序替换 ==
return Double(this.real).equals(other.real) &&
       Double(this.imag).equals(other.imag);