【发布时间】:2015-03-26 10:40:51
【问题描述】:
我从一组地图 (Set<Map<String,String>>) 中得到了意想不到的结果,其中 s.contains(s.iterator().next()) 是 false。
有问题的集合只包含一个映射[{=262.666666666666667}](空字符串映射到字符串262.666666666666667)。
我无法组合一个最小的工作示例来复制问题,因为以下输出为真:
Set s = new HashSet<Map<String,String>>();
Map<String,String> m = new HashMap<>();
m.put("", "262.666666666666667");
s.add(m);
System.out.println(s.contains(s.iterator().next()));
HashMap 不会覆盖 hashCode 但 Abstract map 会(见下文),所以我看不到将 HashMap 放入 HashSet 的问题。
public int hashCode()
{
int h = 0;
Iterator<Entry<K,V>> i = entrySet().iterator();
while (i.hasNext())
h += i.next().hashCode();
return h;
}
这种行为的原因是什么,我该如何解决?
编辑:感谢 doublep 和 morgano,我确实在添加地图后修改了地图,并通过在修改后而不是之前添加解决了问题。
【问题讨论】:
-
多线程?在我们得到重现问题的某事之前,很难提供帮助...
-
您的独立示例在单线程上执行时返回
true。 -
意外结果是什么意思?
-
可能是一些舍入问题?
-
如果你修改了成员地图之后添加到集合中,从而改变了地图的哈希码,集合将被破坏。这就是 Python 要求字典键不可变的原因。