我經歷了一些非常恐怖的TreeMap行爲,並且在縮小測試用例方面遇到了一些麻煩,請耐心等待。TreeMap put()默默刪除其他條目?
我想從運行時提供的文件中將大量的鍵值對讀入Map中。我正在使用自定義密鑰類。後來,當我退回時,我發現其中一個或多個失蹤。使用一個調試器和一些測試用例,我已經確定缺失的條目在讀取階段肯定會消失,但我不確定是什麼原因造成的。
基本上是:
Map<MyKey,Double> map = new TreeMap<MyKey,Double>();
map.put(key1,value1);
// ... put another ~500 entries into the map ...
assertTrue(map.containsKey(key1)); // passes
if (!map.containsKey(keyN)) {
map.put(keyN, valueN); // this code executes
}
assertTrue(map.containsKey(key1)); // FAILS
...所以基本上,增加一個全新的關鍵地圖導致無關項掉下來的吧。
- 如果我剛添加KEY1和keyN單獨,KEY1保留在地圖 - 居間500項是重要的不知何故
- 如果我從2移除一個或兩個任意鍵。(N-1),當keyN被添加時,key1仍然被引導
- 如果我從2 ..(N-1)中刪除大範圍的密鑰,則key1在添加keyN時保持不變,但當添加(比如說)keyQ時,鍵下一行
- 不幸的是,當keyN踢出key1時,map的大小是而不是,因爲keyQ踢出key1時它的大小與map的大小相同,所以它是probab不是有限大小的問題
- 如果我使用HashMap代替,key1仍然在地圖中
- 自定義密鑰類MyKey對Comparable,equals和hashCode使用相同的邏輯。
我最初使用的是TreeMap,因爲我期望使用大型數據集,並且TreeMap有更高的內存效率。 HashMap將會是一個很好的選擇,但看到TreeMap的行爲方式仍然令人震驚 - 任何人都會對這裏發生的事情有所想法?
同意Steve Kuo。註釋掉你的compareTo/equals/hashCode實現並再次運行你的測試,看看你是否遇到同樣的問題。 – digitaljoel