2010-10-31 29 views
3

這段代碼會生成意外的輸出。正確使用自定義類的哈希表

Hashtable<Pair, Integer> results = new Hashtable<Pair, Integer>(); 
results.put(new Pair(0, 1), 2); 
System.out.println("[DBG] " + results.containsKey(new Pair(0, 1))); 

輸出是[DBG] false。爲什麼Hashtable無法註冊此元素?這與我嘗試將Pair傳遞給哈希表的方式有關嗎?

回答

8

您必須覆蓋您的Pair類的hashCode()equals(..)以指示具有相同數字的兩個對象相等。 (最好讓你的IDE爲你生成這兩種方法。)

Hashtable使用hashCode()來確定對象的散列並查找它。當你創建一個新的Pair實例的Object默認散列實現生成不同的哈希,因此你Hashtable未能找到一對(這是成功的內部)

最後 - 使用的HashMap代替Hashtable。這是一個更新,更好的概念實現,並沒有不必要的同步。

+5

(而用'@ Override'以避免試圖覆蓋散列碼的'喜歡()'或'等於(對)') – 2010-10-31 21:46:51

2

它是由使用new Pair(0,1)創建兩個不同的對象造成的。所以你有兩種選擇:

第一個是你應該實現hashCode和等於Pair類的方法。

第二個使用相同的對象是這樣的:

Hashtable<Pair, Integer> results = new Hashtable<Pair, Integer>(); 
Pair key=new Pair(0, 1) 
results.put(key, 2); 
System.out.println("[DBG] " + results.containsKey(key));