2014-10-07 85 views
1
  1. 我同時覆蓋hashCode()和equals()方法,但我不修改重寫方法內部的任何物件。重寫的hashCode()和equals()方法

    @Override 
    public int hashCode() { 
        int hash = 7; 
        hash = 67 * hash + Objects.hashCode(this.model); 
        hash = 67 * hash + this.year; 
        return hash; 
    } 
    
    @Override 
    public boolean equals(Object obj) { 
        if (obj == null) { 
         return false; 
        } 
        if (getClass() != obj.getClass()) { 
         return false; 
        } 
        final PC other = (PC) obj; 
        if (!Objects.equals(this.model, other.model)) { 
         return false; 
        } 
        if (this.year != other.year) { 
         return false; 
        } 
        return true; 
    } 
    
  2. 我創建2個相同的對象:

    PC One = new PC(); 
    
    One.setModel("HP"); 
    
    One.setYear(2013); 
    
    PC Two = new PC(); 
    
    Two.setModel("HP"); 
    
    Two.setYear(2013); 
    
  3. 我比較這些2個對象:

    if (One.equals(Two)) { 
    
         System.out.println("They are the same objects!"); 
    
        } else { 
    
         System.out.println("They are different objects!"); 
        } 
    

的結果是: 「他們是同一對象」 。但是,如果我不覆蓋這兩種方法,結果將是:「它們是不同的對象!」。 因爲hashCode對於每個對象都是唯一的(我想),我期望它的結果是:「它們是不同的對象!」。 問:爲什麼?

+0

「PC」的超類是什麼? – 2014-10-07 18:33:22

+3

你的重寫「equals」是什麼樣的? – Eran 2014-10-07 18:33:41

+0

@PatriciaShanahan,Class Object,意思是PC沒有我定義的超類。 – Insanovation 2014-10-07 18:35:57

回答

4

默認equals執行Object使用實例的引用地址。兩個Objects只有在它們駐留在內存中的相同位置時纔是相等的。

如果您不覆蓋equals這是您得到的實現。

此外,此行爲與hashCode無關,您是不是撥打hashCode。如果您直接撥打equals,則不會使用hashCode。通常在數據結構中使用hashCode,就像HashMap一樣。

3
@Override 
public boolean equals(Object obj) { 
    if (obj == null) { 
     return false; 
    } 
    if (getClass() != obj.getClass()) { 
     return false; 
    } 
    final PC other = (PC) obj; 
    if (!Objects.equals(this.model, other.model)) { 
     return false; 
    } 
    if (this.year != other.year) { 
     return false; 
    } 
    return true; 
} 

這個方法聲稱是equals方法的默認實現是不正確的。等於缺省值,通過==相等運算符進行比較,該運算符將32位或64位指針引用與JVM內存位置進行比較。勾選此link

public boolean equals(Object obj) { 
     return (this == obj); 
} 
+0

我沒有聲稱它是equals()方法的默認實現,儘管我想確保在我的問題中提供的equals()方法不是默認一個。謝謝。 – Insanovation 2014-10-07 19:04:23

1

如果不重寫equals,你PC對象繼承equals method from Object,執行同樣的事情== - 比較對象引用,看看他們是否是同一個對象。

Object類的equals方法實現對象上最可能的等價關係;也就是說,對於任何非空引用值x和y,當且僅當x和y引用同一對象(x == y的值爲true)時,此方法返回true。

所以,你equals方法比較你PC對象的內部內容後返回true,但不重寫時,Objectequals方法返回false,因爲它們是不同的對象。

0

equals()方法比較2個正常目的,等號的默認實現時方法用於()是基於所述對象的內存位置。

然而,的hashCode()只用散列數據結構使用,如:的HashSet,HashMap中,哈希表 ..

每當一個元素添加到這些結構,或搜索元素,結構使用對象的哈希代碼並將其與現有哈希代碼進行比較,以確定該元素是否已存在。

tutorial很好地描述了這兩個平等的使用()hashCode()方法方法時,它的必要覆蓋他們。

相關問題