2010-09-12 146 views
3

我需要寫的隊伍類是與提供的hashCode方法equals()方法的幫助

hashCode方法

public int hashCode() 
    { 
     return this.getPro().hashCode() 
      + this.getTeam().hashCode(); 
    } 

我的equals方法相一致的equals()方法,但不會工作

public boolean equals(Object obj) 
    { 
    ClassName pro = (ClassName) obj; 
    return (this.getPro().hashCode() == pro.getPro()); 
      (this.getTeam().hashCode() == pro.getTeam()); 
    } 

任何幫助將是不錯的

+1

您與對象比較哈希碼。這是行不通的。你想達到什麼目的?你認爲hashCode()做什麼? – 2010-09-12 18:43:10

+0

如果要將對象放入HashSet或HashMap中,那麼兩個相等的對象必須返回相同的hashCode,並且返回不同hashCode的兩個對象必須不相等。兩個不相等的對象可以返回相同的hashCode(例如,有40億個可能的hashCode,但有更多可能的String)。你不能用hashCode()來定義equals();可能會說兩個不平等的東西是平等的。 – 2010-09-12 19:11:08

回答

2
  1. 兩個對象的哈希值相等並不意味着這兩個對象是相等的。
  2. 要檢查兩個條件是否都滿足,請使用&&

因此,

public boolean equals(Object obj) 
    { 
    ClassName pro = (ClassName) obj; 
    return this.getPro() == pro.getPro() && this.getTeam() == pro.getTeam(); 
    } 

而且,你的hashCode()不會產生好的哈希,並equals()將無法​​在許多情況下(例如與非ClassNamenull比較)。有關如何正確實施它們,請參見Overriding equals and hashCode in Java。假設沒有派生類,請嘗試

@Override public boolean equals(Object obj) { 
    if (obj == this) return true; 
    if (!(obj instanceof ClassName)) return false; 
    ClassName pro = (ClassName)obj; 
    <sometype> thisPro = getPro(); 
    if (thisPro == null || !thisPro.equals(pro.getPro()) return false; 
    <sometype> thisTeam = getTeam(); 
    if (thisTeam == null || !thisTeam.equals(pro.getTeam()) return false; 
    return true; 
} 
+2

我不會使用'=='來比較'equals()'方法中的對象。大部分時間(如果不是總是),如果對象的內容相等,那麼對象本身是相等的。 – 2010-09-12 19:00:38

+0

條件(obj == null)是多餘的:(null instanceof ClassName)== false – meriton 2010-09-12 19:11:59

+0

@Colin:Oops我假定'=='比較值而不是引用。固定。 – kennytm 2010-09-12 19:12:32

3

在此處將一個哈希碼(一個int)與一個對象進行比較。另外在你的陳述中間還有一個分號。

而應該試試這個:

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 

    MyClass myClass = (MyClass) o; 

    if (!pro.equals(myClass.pro)) return false; 
    if (!team.equals(myClass.team)) return false; 

    return true; 
} 

在這裏,您比較對象的內容。


@Bart K.評論後,這裏是寫你equals()方法,如果球隊或Pro可以爲空的方式:

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 

    MyClass myClass = (MyClass) o; 

    if (pro != null ? !pro.equals(myClass.pro) : myClass.pro != null) return false; 
    if (team != null ? !team.equals(myClass.team) : myClass.team != null) return false; 

    return true; 
} 

資源:

關於同一主題:

+0

'equals(...)'還應該檢查'obj == null'。 – 2010-09-12 18:47:08

+0

這取決於親和隊是否可以空。由於它們似乎不可空(參見OP'hashCode()'),所以它並不是必須的。 – 2010-09-12 18:48:16

+0

不,我並不是說'pro'或'team'是null而是'obj'。例如,'ArrayList '可以包含'null'引用,並且如果對其執行'contains(instanceOfClassName)',則在將'null'與'this'進行比較時,您的實現會拋出NPE。 – 2010-09-12 18:52:29