考虑以下Java程序:
class Complex {
private double re, im;
public Complex(double re, double im) {
this.re = re;
this.im = im;
}
}
// Driver class to test the Complex class
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("Equal ");
} else {
System.out.println("Not Equal ");
}
}
}
输出:
Not Equal
打印“Not Equal”的原因很简单:比较c1和c2时,将检查c1和c2是否都引用相同的对象(对象变量在Java中始终是引用)。 c1和c2引用两个不同的对象,因此值(c1 == c2)为假。如果我们像下面创建另一个引用说c3,则(c1 == c3)将为true。
Complex c3 = c1; // (c3 == c1) will be true
那么,我们如何检查对象内部值的相等性呢? Java中的所有类都直接或间接地从Object类继承(请参见此点1)。 Object类具有一些基本方法,例如clone(),toString(),equals()等。我们可以在类中重写equals方法,以检查两个对象是否具有相同的数据。
class Complex {
private double re, im;
public Complex(double re, double im) {
this.re = re;
this.im = im;
}
// Overriding equals() to compare two Complex objects
@Override
public boolean equals(Object o) {
// If the object is compared with itself then return true
if (o == this) {
return true;
}
/* Check if o is an instance of Complex or not
"null instanceof [type]" also returns false */
if (!(o instanceof Complex)) {
return false;
}
// typecast o to Complex so that we can compare data members
Complex c = (Complex) o;
// Compare the data members and return accordingly
return Double.compare(re, c.re) == 0
&& Double.compare(im, c.im) == 0;
}
}
// Driver class to test the Complex class
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("Equal ");
} else {
System.out.println("Not Equal ");
}
}
}
输出:
Equal
附带说明,当我们覆盖equals()时,建议也覆盖hashCode()方法。如果我们不这样做,则相等的对象可能会获得不同的hash-values;基于哈希的集合(包括HashMap,HashSet和Hashtable)不能正常工作(有关更多详细信息,请参见此内容)。我们将在另一篇文章中介绍有关hashCode()的更多信息。
参考文献:
有效的Java第二版
相关用法
- Java MathContext equals()用法及代码示例
- Java RuleBasedCollator equals()用法及代码示例
- Java BigInteger equals()用法及代码示例
- Java DecimalFormat equals()用法及代码示例
- Java IdentityHashMap equals()用法及代码示例
- Java Calendar.equals()用法及代码示例
- Java Set equals()用法及代码示例
- Java YearMonth equals()用法及代码示例
- Java StringWriter equals()用法及代码示例
- Java BigDecimal equals()用法及代码示例
- Java TreeSet equals()用法及代码示例
- Java LongBuffer equals()用法及代码示例
注:本文由纯净天空筛选整理自 Overriding equals method in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。