考慮以下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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。