2013-11-25 98 views
1

我是一個java的新學習者。我已經爲我的動物課覆蓋了equalshashcode。我期望,使用如下的HashSet<Animal>,只有一個Animal將被插入HashSet。然而,第二個Animal對象即使具有相同的屬性也會被添加到集合中。任何人都可以看看它嗎?等於方法重寫問題

import java.util.*; 

class SetTest 
{  
    public static void main(String [] args) 
    { 
     Set<Animal>s=new HashSet<Animal>(); 
     Animal a=new Animal(2); 
     boolean b1=s.add(a); 
     System.out.println("hi "+b1); 

     Animal b=new Animal(2); 
     boolean b2=s.add(b); 
     System.out.println("hi "+b2);  
    } 
} 


class Animal 
{ 
    int t; 
    Animal(int a) 
    { 
     t=a;  
    } 

    public boolean equals(Object O) 
    { 
     if(O instanceof Animal && ((Animal)O).t==t) 
      return true; 

     return false; 
    } 

    public int hashcode() 
    { 
     return t; 
    } 
} 

輸出: 喜真 喜真

非常感謝。

+1

問題是什麼? – Maroun

回答

7

您沒有覆蓋hashCode()。你介紹了另一種叫做hashcode()的方法。案件事宜。

當你的目的是要覆蓋一個方法,始終使用@Override註釋:

@Override 
public int hashcode() 

如果你這樣做了,編譯器會注意到錯字並拒絕編譯類。

1

您的代碼有一個錯誤的hashcode:寫hashCode不是hashcode。

import java.util.*; 
class SetTest { 
    public static void main(String [] args) { 
    Set<Animal>s=new HashSet<Animal>(); 
    Animal a=new Animal(2); 
    boolean b1=s.add(a); 
    System.out.println("hi "+b1); 
    Animal b=new Animal(2); 
    boolean b2=s.add(b); 
    System.out.println("hi "+b2); 
    } 
} 

class Animal { 
    int t; 

    public Animal(int a) { 
     t=a; 
    } 

    @Override 
    public boolean equals(Object O) { 
    return O instanceof Animal 
      && ((Animal)O).t==t; 
    } 

    @Override 
    public int hashCode() { 
    return t; 
    } 
} 
0

如果你使用Eclipse,你可以使用源代碼生成的,有通過避免人類共同的錯誤(像你這樣做是在這裏右鍵單擊類 - >來源 - >生成hashcode和equals方法,它會彈出窗口,在那裏你可以選擇你需要考慮的字段,你需要考慮等於(等於對象)和散列碼的生成

0

Java使用hashCode和equals方法來檢查兩個對象是否相等。HashSet內部使用HashMap,你可以參考HashMap.put(K key,V value)方法獲取更多詳細信息。