java - HashSet.clear() 未按预期工作

标签 java hashmap hashset

我有一个 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/

相关文章:

java - Stream.count() 导致 NPE

android - 从字符串中删除无效的数字字符

java - 如何让一个集合保留包含我在java中指定子字符串的所有字符串?

java - 使用 Clojure 中的 Geotools - 未处理的 java.lang.NoSuchFieldError METER

java - Equinox 中的 Sling 日志记录配置

java - 使用添加或删除元素方法将哈希表实现为属性

java - 如何在Hashmap中添加与key对应的列表元素?

java - 在windows中监听 "folder opening"事件(java)

java - 如何使用 PojoCodecProvider 忽略 getter/setter

java - 如何在 Java 中实现检查数独是否有效?