[英]Correct use of Hashtable with custom class
這段代碼會產生意外的輸出。
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
傳遞給哈希表的方式有關?
您必須覆蓋Pair
類的hashCode()
和equals(..)
以指示具有相同數字的兩個對象相等。 (最好讓IDE為您生成這兩種方法。)
Hashtable
使用hashCode()
來確定對象的哈希並查找它。 當您創建一個新的Pair
實例時, Object
的默認哈希實現會生成一個不同的哈希,因此您的Hashtable
無法找到該對(在內部成功)
最后 - 使用HashMap
而不是Hashtable
。 它是一個更新,更好的概念實現,並沒有不必要的同步。
它是通過使用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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.