嵌套的Hashmap更新所有键的所有值,而不是我想要更改的值

时间:2011-11-02 07:31:41

标签: java hashmap

我有一个包含10个子hashmap的hashmap,这些子hashmap 5中的每一个都映射到一个String数组。当我想从子hashmap更新特定键的值时,所有键都会更新;不仅如此,而且所有孩子的hashmap也都得到了更新。这段代码说明了我在做什么。

HashMap<String, HashMap<String, String[]>> parentMap = new HashMap<String, HashMap<String, String[]>>();

for(String x : someArray){ // Adds 10 children hashmaps to parentMap
    parentMap.put(x,new HashMap<String, String[]>());
    for(String y : someOtherArray){ // Creates 5 keys for each of the children hashmaps
        parentMap.get(x).put(y,stringArray);
    }
}

parentMap.get(someKey).put(someOtherKey,modifiedArray); // This updates the entry I want to update.

当我使用最后一条指令更新时,我想要更新该密钥,但是所有内容都会更新,所有子哈希映射的所有密钥都会更新,而不是我想要的。

希望这是有道理的,我不确定这是否是正确的方法,但我一直在网上寻找任何类似的东西没有运气的提示。我对Java并不擅长,如果我能用更简单的东西来实现相同的结果,那将是受欢迎的,请注意我不能使用List或类似的东西,因为它使用int索引,我需要引用使用字符串(就像python上的字典)对我的对象。

2 个答案:

答案 0 :(得分:5)

这是因为您初始化所有地图以包含stringArray,即相同的数组

这就是为什么改变其中一个会改变所有这些。

如果您希望每个内部地图中的每个键都指向数组的不同副本,则需要执行类似

的操作
...
    parentMap.get(x).put(y, Arrays.copyOf(stringArray, stringArray.length));
                            ^^^^^^^^^^^^^^           ^^^^^^^^^^^^^^^^^^^^^
...

(您也可以使用例如clone或每次需要新副本时手动创建新数组。)

答案 1 :(得分:0)

@aioobe解释了原因。

这是解决方案。每次将它放入地图时都必须创建初始数组的副本:

String[] tmpArr = new String[stringArray.length];
arraycopy(stringArr, 0, tmpArr, 0, stringArray.length);
parentMap.get(x).put(y,stringArray);