當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Java Overriding equals用法及代碼示例


考慮以下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第二版



相關用法


注:本文由純淨天空篩選整理自 Overriding equals method in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。