2012-07-06 146 views
0

我有一個類myDemoClass存儲名稱和類放在HashMap。在嘗試覆蓋hashCode()方法時,即使哈希碼不同,HashMap也會返回null。爲什麼?我已經覆蓋了hashCode()方法,以便即使具有相同的名稱值,不同的對象也將具有不同的哈希碼。不同的哈希碼,但哈希映射不工作

public class myDemoClass { 

    String name; 
    int value; 
    static int i=1; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int hashCode() 
    { 
     //return name.hashCode();//now the hashcode are same 
     return i++;//now the hashcode is different 
    } 

    public boolean equals(Object obj) 
    { 
     myDemoClass m=(myDemoClass)obj; 
     if(obj==this) 
      return true; 

     if(obj instanceof myDemoClass) 
     { 
      return getName().equals(m.getName()); 
     } 

     return false; 
    } 

} 

public class Hashcodes { 

    myDemoClass m1=new myDemoClass(); 
    myDemoClass m2=new myDemoClass(); 

    HashMap h=new HashMap(); 

    public boolean test() 
    { 
     m1.setName("s"); 
     m2.setName("s"); 
     System.out.println(m1.hashCode()); 
     System.out.println(m2.hashCode()); 

     h.put(m1, "a1"); 
     h.put(m1, "b1"); 

     System.out.println(h.get(m1)); 
     System.out.println(h.get(m2)); 
     System.out.println(h.get(m1)); 

     return true; 
    } 

    public static void main(String args[]) 
    { 
     Hashcodes h=new Hashcodes(); 
     h.test(); 
    } 

} 

不同的散列碼輸出:

1 
2 
null 
null 
null 

輸出具有相同的散列碼:

115 
115 
b1 
b1 
b1 

回答

1

注意,你做你的hashCode()函數返回一個靜態字段得到增加調用hashCode()的時間。這會導致哈希碼在每次調用時都會有所不同,即使對於同一個對象!

例如,假定有以下代碼:

MyDemoClass m1 = new MyDemoClass(); 
m1.hashCode(); 
m1.hashCode(); 

到的hashCode)的第一次調用()返回1,則靜態字段被遞增到2到的hashCode的下一個呼叫(返回圖2,這與之前的不一樣。由於對象不會跟蹤其個人散列碼並且每次都引用相同的靜態字段,因此對象永遠不會返回相同的散列碼,並且您的HashMap將始終返回空值。

0

我同意上面的答案,使用靜態字段來計算一個對象的hashCode是不好的做法。請考慮只使用非靜態字段,在你的情況 - 執行中出了什麼問題:
public int hashCode() { return name.hashCode()* 31 +(new Integer(value))。hashCode(); }