gpt4 book ai didi

java - hashmap 在调用 containsKey() 时检查什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:50:51 25 4
gpt4 key购买 nike

    ArrayList<Integer> lis = new ArrayList<Integer>();
lis.add(2);
lis.add(3);
ArrayList<Integer> lis2 = new ArrayList<Integer>();
lis2.add(2);
lis2.add(3);
HashMap<ArrayList<Integer>, Integer> map = new HashMap<ArrayList<Integer>, Integer>();
map.put(lis, 7);
System.out.println(map.containsKey(lis2));

最初,我希望代码打印出“false”,因为 lis 和 lis2 是不同的对象。令人惊讶的是,代码打印出“true”。 hashmap 在调用 containsKey() 时检查什么?

最佳答案

它检查 .hashCode 来找到桶,然后使用 .equalsList.equals 返回 true 如果所有元素的顺序相同并且也是 .equalsArrayList.hashCode 将为具有相同元素的两个 ArrayList 实例返回相同的值,因此它会找到正确的桶,然后使用 .equals 和看到列表的元素相同且顺序相同。

例如:

ArrayList<Integer> lis = new ArrayList<Integer>();
lis.add(2);
lis.add(3);
ArrayList<Integer> lis2 = new ArrayList<Integer>();
lis2.add(2);
lis2.add(3);
System.out.println(lis.equals(lis2)); // Prints "true"

同样值得注意的是,您永远不要HashMap 中使用可变对象作为键。通过修改 key ,您可以导致其所在的存储桶无效。例如,如果我这样做:

map.put(lis, 7);
lis.add(3);
System.out.println(map.get(lis)); // Prints "null", *not* "7"

这是因为添加另一个元素改变了lis.hashCode()的值。当您put 列表时,hashCode 用于选择一个桶。通过添加新元素,您可以更改它将使用的存储桶,但它不会更改您已添加到 map 的条目的存储桶。添加到上面:

map.put(lis, 7);
lis.add(3);
map.put(lis, 7);
System.out.println(map.size()); // Prints "2"

第二次解析为不同的桶,因此将其视为第二个元素。

在这种情况下,您可以使用 Collections.unmodifiableList 来“卡住”列表,添加它,然后再也不会碰它:

map.put(Collections.unmodifiableList(lis), 7);

稍后,如果您调用 get().add(3):

map.get(7).add(3);

这将抛出一个 UnsupportedOperationException

关于java - hashmap 在调用 containsKey() 时检查什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19651964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com