我有一个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的大小预计会很大)。我错过了什么吗?
感谢您的帮助。
答案 0 :(得分:1)
实际上,您正在修改相同的set
对象,即您的所有3个键(在Map
内)都拥有对同一set
个对象的引用。
因此,如果您想要单独清除并处理每个set
,只需为set
中的每个键使用新的Map
对象:
set = new HashSet<String>();
答案 1 :(得分:1)
如果您打印HashMap的地址或Debuging它,您可以看到所有对象都引用相同的地址。
如果您正在使用eclipse或netbeans,您可以创建一个断点并查看每个步骤的地址和状态。
祝你好运