爲什麼可以循環TreeMap的keySet
並獲得.containsKey == false
?Java TreeMap包含一個鍵,但containsKey調用返回false(即使鍵完全相同也是不變的對象)
for (Object thisObject : map.keySet()) {
if (!map.containsKey(thisObject)) {
System.out.println("This line should be never reached.");
}
}
經過很多次,很多不同的迭代和調用這條線被擊中。 A map.get(thisObject)
將返回null
。 但調試顯示密鑰(相同的引用,值和散列)和實際值在地圖中。該地圖是一個小的(25種元素)TreeMap<Long, Double>
UPDATE:
由於猜測通過@rgettman那裏有在樹形圖的構建中使用的排序Comparator
自定義的(沒有看到它,因爲它是從另一個構造類)。這種比較只是(我猜的)副本從here
更改粘貼Comparator
:
public int compare(Object a, Object b) {
if((Double)base.get(a) > (Double)base.get(b)) {
return 1;
} else if((Double)base.get(a) == (Double)base.get(b)) {
return 0;
} else {
return -1;
}
}
到
...
} else if(base.get(a).equals(base.get(b))) {
return 0;
...
解決了這個問題。之所以出現這個問題,是因爲在數百萬次操作之後出現的情況是,沒有任何情況下地圖對於兩個不同的鍵具有兩個相似的值,因爲在上下文中這是不太可能的。
所以在:
25151l, 1.7583805400614032
24827l, 1.7583805400614032
失敗。
感謝您的幫助!
你可以嘗試將==改爲.equals嗎? –
@RameshK我的意思是,OP已經確認它是相同的參考,所以不應該有'=='的問題,應該在那裏? –
失敗的關鍵值是什麼? – rgettman