我有一个 HashMap ,其中包含字符串的哈希集作为值。我编写了一个测试代码 - 如下所示:
public static void main(String args[]) {
HashMap<String, HashSet<String>> hmap = new HashMap<String, HashSet<String>>();
HashSet<String> set = new HashSet<String>();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
hmap.put("a", set);
set.clear();// = new HashSet<String>();
set.add("a");
set.add("b");
hmap.put("c", set);
set.clear();// = new HashSet<String>();
set.add("a");
set.add("b");
set.add("c");
hmap.put("b", set);
for (Entry<String, HashSet<String>> entry : hmap.entrySet())
{
System.out.println(entry.getKey() + " - " + entry.getValue());
}
}
我重复使用相同的哈希集来填充 HashMap 中的值。但我发现 hashset.clear() 没有按预期清除值。
我得到的上述代码的代码是-
b - [b, c, a]
c - [b, c, a]
a - [b, c, a]
因此,所有值都被最后一个 HashSet 覆盖。我阅读了clear() 的javadoc,预期的行为是在调用clear 时删除哈希集的元素。
当我使用 new HashSet 而不是 hashset.clear() 时的输出
b - [b, c, a]
c - [b, a]
a - [d, b, c, a]
这是我期望的输出。
我不想使用set = new HashSet<String>
的原因每次都是因为我不想创建太多的哈希集( HashMap 的大小预计很大)。我错过了什么吗?
感谢您的帮助。
最佳答案
如果打印 HashMap 的地址或对其进行调试,您可以看到所有对象都引用相同的地址。
如果您使用的是eclipse或netbeans,您可以打断点并查看每一步的地址和状态。
祝你好运
关于java - HashSet.clear() 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43403311/