我有一个奇怪的情况 - 有一个HashMap,初始化如下:
HashMap<String, HashSet<String>> downloadMap = new HashMap<String, HashSet<String>>();
然后我有以下内容,将通过石英调度程序无限期执行:
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]
有谁知道为什么会这样?
提前谢谢!
答案 0 :(得分:3)
您似乎在HashSet<String>
的所有值中使用了相同的HashMap<String, HashSet<String>>
引用。了解这一点,问题在于如何在HashSet<String>
中插入HashMap
。请注意,您必须为每个键值对使用新的HashSet<String>
引用。
相应更新您的问题以获得更具体的答案。
与真正的问题没有直接关联,最好是面向接口而不是直接的类实现。有了这个,我的意思是你应该将downloadMap
变量声明为
Map<String, Set<String>> downloadMap = new HashMap<String, Set<String>>();
类似于将放在此地图中的Set
。
更多信息:
答案 1 :(得分:1)
解决方案是重新编程retrieve()
,这样每次调用它时都会返回一个不同的HashSet。事实上,我的首选解决方案是允许调用者指定将retrieve
个对象作为参数的位置:
myHashSet= retrieve( new HashSet<String>() ) ;
因此,如果一个不同的程序想要在一个集合中累积对象,它可以通过使用相同的集合调用retrieve
来实现。客户端有最后一个字!