HashMap把方法说明一下

时间:2013-09-03 02:56:32

标签: java hashmap

我有一个奇怪的情况 - 有一个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]

有谁知道为什么会这样?

提前谢谢!

2 个答案:

答案 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来实现。客户端有最后一个字!