在项目中,我使用的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