gpt4 book ai didi

java - 如何在 Java map 中使用集合作为键

转载 作者:太空狗 更新时间:2023-10-29 23:02:37 24 4
gpt4 key购买 nike

我有一个使用 Set 作为键类型的 Map,如下所示:

Map<Set<Thing>, Val> map;

当我查询 map.containsKey(myBunchOfThings) 时,它返回 false,我不明白为什么。我可以遍历键集中的每个键并验证是否有一个键 (1) 具有相同的 hashCode,并且 (2) 是 equals() 到 myBunchOfThings。

System.out.println(map.containsKey(myBunchOfThings)); // false.
for (Set<Thing> k : map.keySet()) {
if (k.hashCode() == myBunchOfThings.hashCode() && k.equals(myBunchOfThings) {
System.out.println("Fail at life."); // it prints this.
}
}

我是否只是从根本上误解了 containsKey 的合约?使用集合(或更一般地说,集合)作为映射的键有什么 secret 吗?

最佳答案

键在 map 中使用时不应发生变化。 Map java 文档说:

Note: great care must be exercised if mutable objects are used as map keys. The behavior of a map is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is a key in the map. A special case of this prohibition is that it is not permissible for a map to contain itself as a key. While it is permissible for a map to contain itself as a value, extreme caution is advised: the equals and hashCode methods are no longer well defined on a such a map.

我知道这个问题,但直到现在才进行测试。我再详细说明一下:

   Map<Set<String>, Object> map  = new HashMap<Set<String>, Object>();

Set<String> key1 = new HashSet<String>();
key1.add( "hello");

Set<String> key2 = new HashSet<String>();
key2.add( "hello2");

Set<String> key2clone = new HashSet<String>();
key2clone.add( "hello2");

map.put( key1, new Object() );
map.put( key2, new Object() );

System.out.println( map.containsKey(key1)); // true
System.out.println( map.containsKey(key2)); // true
System.out.println( map.containsKey(key2clone)); // true

key2.add( "mutate" );

System.out.println( map.containsKey(key1)); // true
System.out.println( map.containsKey(key2)); // false
System.out.println( map.containsKey(key2clone)); // false (*)

key2.remove( "mutate" );

System.out.println( map.containsKey(key1)); // true
System.out.println( map.containsKey(key2)); // true
System.out.println( map.containsKey(key2clone)); // true

key2 发生变异后, map 不再包含它。我们可以认为映射在添加数据时“索引”了数据,然后我们期望它仍然包含 key2 克隆(用 * 标记的行)。但有趣的是,事实并非如此。

因此,正如 java 文档所说,不应更改键,否则行为未指定。期间。

我想这就是您的情况。

关于java - 如何在 Java map 中使用集合作为键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2393296/

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