📜  Java重写equals方法

📅  最后修改于: 2020-03-20 14:12:30             🧑  作者: Mango

考虑以下Java程序:

class Complex {
    private double re, im;
    public Complex(double re, double im) {
        this.re = re;
        this.im = im;
    }
}
// 测试代码
public class Main {
    public static void main(String[] args) {
        Complex c1 = new Complex(10, 15);
        Complex c2 = new Complex(10, 15);
        if (c1 == c2) {
            System.out.println("相等 ");
        } else {
            System.out.println("不相等 ");
        }
    }
}

输出:

不相等

打印“不等于”的原因很简单:比较c1和c2时,将检查c1和c2是否都引用相同的对象(对象变量在Java中始终是引用)。c1和c2引用两个不同的对象,因此值(c1 == c2)为假。如果我们像下面创建另一个引用c3,则(c1 == c3)将为true。

Complex c3 = c1;  // (c3 == c1)返回真

那么,我们如何检查对象内部值的相等性呢?Java中的所有类都直接或间接地从Object类继承(请参见继承)。该Object类有类似克隆的一些基本方法如:toString(),equals()方法,…等,我们可以重写我们类的equals方法检查两个对象是否具有相同的数据。

class Complex {
    private double re, im;
    public Complex(double re, double im) {
        this.re = re;
        this.im = im;
    }
    // 重写equals()比较两个Complex对象
    @Override
    public boolean equals(Object o) {
        // 如果和自己比较,返回ture
        if (o == this) {
            return true;
        }
        /* 检查o是否是Complex的一个对象
          "null instanceof [type]" 也会返回false */
        if (!(o instanceof Complex)) {
            return false;
        }
        // 类型转换为Complex
        Complex c = (Complex) o;
        // 比较成员数据
        return Double.compare(re, c.re) == 0
                && Double.compare(im, c.im) == 0;
    }
}
// 测试代码
public class Main {
    public static void main(String[] args) {
        Complex c1 = new Complex(10, 15);
        Complex c2 = new Complex(10, 15);
        if (c1.equals(c2)) {
            System.out.println("相等 ");
        } else {
            System.out.println("不相等 ");
        }
    }
}

输出:

Equal

附带说明一下,当我们重写equals()时,建议也重写hashCode()方法。如果我们不这样做,则相等的对象可能会获得不同的哈希值,其他的例如HashMap,HashSet的,和Hashtable不能正常工作。我们将在另一篇文章中介绍有关hashCode()的更多信息。