2012-07-07 74 views
0
class A{ 

     @Override 
     public int hashCode() { 
     return 10; 
    } 
} 

public class SampleClass { 

    public static void main(String[] args){ 
     Map map = new HashMap(); 

     map.put(new A(), "A"); 
     map.put(new A(), "B"); 

     System.out.println(map.size()); 

     System.out.println(new A().hashCode()); 
     System.out.println(new A().hashCode()); 
    } 
} 

輸出: -的hashCode實現

2 

10 

10 

爲什麼2 ???。如果我們正在實現返回相同整數的hashCode方法。不應該大小爲1?

回答

9

您沒有覆蓋equals(Object),所以它們不會相等。

僅僅因爲兩個對象具有相同的散列碼並不意味着HashMap假定它們是相同的 - 實際上,如果的情況下,這將是真的,真的很糟糕。

如果你希望兩個A對象由HashMap被視爲平等的,你必須在A覆蓋equals(Object)定義一個A爲等於另一個。

+0

嘿,感謝您的快速回復。其實我只是繼續用代碼做無稽之談:) – Jaikrat 2012-07-07 19:29:52

+0

是的,剛剛添加了equals()。它按預期工作。再次感謝。 – Jaikrat 2012-07-07 19:33:11

+0

@Jaikrat請標記爲答案然後;) – Adam 2012-07-07 19:34:25

3

http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode()

hashCode的一般合同是:

  • 每當它是一個Java應用程序的執行,hashCode方法在同一對象不止一次上調用必須始終如一 返回相同的整數,前提是沒有使用等於的信息 對對象進行比較被修改。該整數不必保持 從應用程序的一次執行到同一應用程序的另一次執行 的一致。

  • 如果兩個對象根據equals(Object)方法相等,則對兩個對象中的每個對象調用hashCode方法必須產生相同的整數結果。

  • 不要求,如果兩個對象根據equals不相等(java.lang.Object)方法,然後調用hashCode方法 上所述兩個對象都必須產生不同的整數結果。 但是,程序員應該知道,爲不相等的對象生成不同的 整數結果可能會提高 哈希表的性能。

因此,當談到知道,如果兩個對象是相等的,等於就是去路易指出了道路。哈希碼只會告訴您在何處/如何存儲您的對象給定一個基於散列的集合實現。