HashSet.clear()没有按预期工作

时间:2017-04-13 23:45:01

标签: java hashmap hashset

我有一个hashmap,它有一个字符串的hashset作为值。我制定了一个测试代码 - 如下所示:

 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());
    }
  }

我正在重复使用相同的hashset来填充hashmap中的值。但我发现hashset.clear()没有按预期清除值。

上面代码的代码是 -

b - [b, c, a]
c - [b, c, a]
a - [b, c, a]

因此,所有值都被最后一个HashSet覆盖。我为clear()读取了javadoc,并且预期的行为是在调用clear时删除了hashset的元素。

当我使用新的HashSet而不是hashset.clear()

时输出
b - [b, c, a]
c - [b, a]
a - [d, b, c, a]

这是我期待的输出。

我不想每次都使用set = new HashSet<String>的原因是因为我不想创建太多的hashsets(hashmap的大小预计会很大)。我错过了什么吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

实际上,您正在修改相同的set对象,即您的所有3个键(在Map内)都拥有对同一set个对象的引用。

因此,如果您想要单独清除并处理每个set,只需为set中的每个键使用新的Map对象:

set = new HashSet<String>();

答案 1 :(得分:1)

如果您打印HashMap的地址或Debuging它,您可以看到所有对象都引用相同的地址。

如果您正在使用eclipse或netbeans,您可以创建一个断点并查看每个步骤的地址和状态。

祝你好运