2012-03-08 53 views
-1

我不清楚使用哈希碼的和等於在java.I方法有以下查詢重寫哈希碼,等於在java中

首先

如果我只覆蓋equals方法值弗雷德的所有對象都添加儘管HashSet實現了設置界面,但不能重複使用值。

如果我重寫了equals和hashCode只有一個對象被添加到HashSet.Why?

第三 如果我在這種情況下只實現等於將刪除一個Fred對象將刪除所有?

class Person 
{ 
    String name; 
    Person(String name) { 
     this.name=name; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if(!(obj instanceof Person)) 
     { 
     return false; 
     } 
    Person p = (Person)obj; 
    return p.name.equals(this.name); 
     } 


    /*@Override 
    public int hashCode() { 
     return name.hashCode(); 
    }*/ 
} 

public class HashSetDemo { 

    /* 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     HashSet<Person> s= new HashSet<Person>(); 
     s.add(new Person("Fred")); 
     s.add(new Person("Fred")); 
     s.add(new Person("Fred")); 
     s.add(new Person("Fred1")); 
     for(Person a:s) { 
      System.out.println(a.name); 
     } 

     s.remove(new Person("Fred")); 
     System.out.println(s); 
    } 
} 
+2

這看起來很像功課。如果是這樣,請將其標記爲。 – Viruzzo 2012-03-08 14:55:36

+0

@prerna廣泛的解釋檢查這個http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java – hidralisk 2012-03-08 15:07:21

回答

1

從 「有效的Java」 由Joshua布洛赫,第9項:

你必須在每一個覆蓋equals類中重寫hashCode如果不這樣做將導致違反Object.hashCode的一般合同,這將阻止您的課程與所有基於哈希的館藏(包括HashMap,HashSetHashtable)一起正常運行。

Eclipse IDE將爲您生成hashCodeequals方法。

大多數hashCode方法看起來是這樣的:

public int hashCode() { 
    int result = 17; 
    result = 31 * result + field1; (int) 
    result = 31 * result + field2.hashCode(); (Object) 
    ... for the rest of the fields. 
    return result; 
} 
3

的問題與你的equals方法是this.name == emp.name此檢查兩個字符串指向你應該使用equals代替this.name.equals(emp.name)相同的內存。這將解決你的第一個問題。

hashCode方法告訴你如何轉換爲hashCode。由於您的hashCode等於名稱的hashCode,因此所有的Freds都具有相同的hashCode因此,它們全都覆蓋HashSet中的每個其他對象。這回答你的第二個問題。

我不知道HashSet's確切的實施,但與第一個問題解決這不會是一個問題。

+0

我已經改變了代碼使用等於它仍然打印三次佛瑞德 – coder25 2012-03-08 15:13:15

+0

你didn'取消註釋'HashCode'。 'HashCode'方法確定'HashSet'是否可以正常工作。看看Gilbert Le Blanc的回答。此外,如果你做'人p =新人(「弗雷德」);人p1 =新人(「弗雷德」); System.out.println(p.equals(p1));''你會得到'true'打印。 – twain249 2012-03-08 15:22:26