[英]HashMap put method clarification
我有一个奇怪的情况 - 有一个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]
有谁知道为什么会这样?
先感谢您!
看起来在HashMap<String, HashSet<String>>
所有值中使用相同的HashSet<String>
引用。 知道这一点,问题是如何在HashMap
插入HashSet<String>
。 请注意,必须为每个键值对使用新的HashSet<String>
引用。
相应地更新您的问题以获得更具体的答案。
与真正的问题没有直接关联,最好是面向接口的程序而不是直接的类实现。 有了这个,我的意思是你应该将downloadMap
变量声明为
Map<String, Set<String>> downloadMap = new HashMap<String, Set<String>>();
类似于将放在此地图中的Set
。
更多信息:
解决方案是重新编程retrieve()
这样每次调用它时都会返回一个不同的HashSet。 实际上,我首选的解决方案是允许调用者指定将对象作为参数retrieve
的位置:
myHashSet= retrieve( new HashSet<String>() ) ;
因此,如果一个不同的程序想要在一个集合中累积对象,它可以通过使用相同的集合调用retrieve
来实现。 客户端说完了!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.