📅  最后修改于: 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()的更多信息。