我有一个奇怪的情况 - 有一个 HashMap,初始化如下:
HashMap<String, HashSet<String>> downloadMap = new HashMap<String, HashSet<String>>();
然后我有以下内容,它们将通过 quartz 调度程序无限期执行:
myHashSet = retrieve(animal);
downloadMap.put(myKey, myHashSet);
// do stuff
downloadMap.get(myKey).clear();
之后发生的事情是,一个值与不同的键相关联。所以,例如,我会有这样的东西:
Kitens [cute kitten, sad kitten]
Puppies [cute kitten, sad kitten]
这永远不应该发生。
特别是,在我检索小猫的 HashSet 之后:
myHashSet = retrieve(animal);
myHashSet = [可爱的小猫,悲伤的小猫] downloadMap = 小猫[], 小狗[]
然后 put() 被执行,我得到:
downloadMap = Kitens [cute kitten, sad kitten], Puppies [cute kitten, sad kitten]
有谁知道为什么会这样吗?
提前致谢!
最佳答案
看起来你使用相同的 HashSet<String>
在你所有的值中引用 HashMap<String, HashSet<String>>
.知道这一点,问题是你如何插入 HashSet<String>
在你的HashMap
.请注意,您必须使用新的 HashSet<String>
每个键值对的引用。
相应地更新您的问题以获得更具体的答案。
与实际问题没有直接关联,最好是面向接口(interface)编程而不是直接类实现。有了这个,我的意思是你应该声明 downloadMap
变量为
Map<String, Set<String>> downloadMap = new HashMap<String, Set<String>>();
类似于 Set
s 将放在这张 map 中。
更多信息:
关于java - HashMap put方法说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18583422/