3

我有一个奇怪的情况 - 有一个 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 = Kittens [], Puppies[]

然后 put() 被执行,我得到:

 downloadMap =  Kitens [cute kitten, sad kitten], Puppies [cute kitten, sad kitten]

有谁知道为什么会这样?

先感谢您!

4

2 回答 2

3

看起来您HashSet<String>在所有HashMap<String, HashSet<String>>. 知道了这一点,问题在于如何将HashSet<String>s插入HashMap. 请注意,您必须HashSet<String>为每个键值对使用新的引用。

相应地更新您的问题以获得更具体的答案。

与真正的问题没有直接关联,最好是面向接口的程序而不是直接的类实现。有了这个,我的意思是你应该将downloadMap变量声明为

Map<String, Set<String>> downloadMap = new HashMap<String, Set<String>>();

Set对于将放在此地图中的 s 类似。

更多信息:

于 2013-09-03T03:00:21.823 回答
1

解决方案是重新编程retrieve(),使其每次调用时返回不同的 HashSet。事实上,我首选的解决方案是允许调用者指定retrieve对象的位置作为参数:

    myHashSet= retrieve( new HashSet<String>() ) ;

因此,如果一个不同的程序想要在一个集合中累积对象,它可以简单地通过调用retrieve同一个集合来实现。客户说了算!

于 2013-09-03T03:52:46.647 回答