在項目中,我使用的HashMap爲了存儲一些數據,以及最近我發現,當我的突變HashMap的鍵上,一些意想不到的錯誤的結果可能發生。例如:突變導致錯誤的結果
HashMap<ArrayList,Integer> a = new HashMap<>();
ArrayList list1 = new ArrayList<>();
a.put(list1, 1);
System.out.println(a.containsKey(new ArrayList<>())); // true
list1.add(5);
ArrayList list2 = new ArrayList<>();
list2.add(5);
System.out.println(a.containsKey(list2)); // false
注意兩個a.keySet().iterator().next().hashCode() == list2.hashCode()
和a.keySet().iterator().next().equals(list2)
是真實的。
我不明白爲什麼會發生,指的是事實,兩個對象是相等的,並具有相同的哈希碼。有誰知道這是什麼原因,並且如果有其他類似的結構可以讓鑰匙變形?謝謝。
不要使用可變值hashmap鍵。我認爲它在HashMap的文檔中說過,但目前我找不到它。 –
我知道我不應該(關於我已經展示的例子),但我不明白原因(對象是平等的,並具有相同的哈希代碼),我正在尋找一個類似的結構,允許。 – RanSch
「......如果有其他類似的結構可以讓鑰匙變形?」 - 鑰匙(至少是形成鑰匙的部件)從來不會變得可變,因爲那樣會違反它們的使用。從現實世界的角度來看它:如果你改變你的鑰匙,它不會再打開鎖。如果你改變鎖定,你需要一個新的密鑰。 – Thomas