繁体   English   中英

HashMap把方法说明一下

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM