Hashmap值在所有键中更新

时间:2014-12-26 20:45:21

标签: java hashmap

我有这样的地图

HashMap<String, List<String>> map = new HashMap<String, List<String>>();

地图---&GT; {A = [],B = [],C = []}

我正在尝试将“hai”添加到键A. 但它正在被添加到所有关键。以下是我的代码 我错了某地

for (Entry<String, List<String>> entry  : map.entrySet()) {
    String a = entry.getKey();
    if(a.equals(attr)){
        List<String> temp = entry.getValue();
        temp.add("hai");
        map.put(a, temp);
        System.out.println("----------"+map);
    }
}

输出:------------ {A = [hai],B = [hai],C = [hai]}

请建议

提前致谢

2 个答案:

答案 0 :(得分:3)

不确定为什么会发生这种情况,也许正如Eran所建议的那样,你没有表现出来。但是,有一种更简单的方法可以做到这一点,而不是遍历所有键......

Map<String, List<String>> map = new HashMap<>();
...
List<String> values = map.get(attr);
if(values == null) {
    values = new ArrayList<String>();
    map.put(attr, values);
}
values.add("hai");

我只是在这里猜测,但我怀疑你是在做这个来创建阵列......

Map<String, List<String>> map = new HashMap<>();
List<String> values = new ArrayList<>();
map.put("A", values);
map.put("B", values);
map.put("C", values);

这会导致A,B和C共享同一个List实例。因此,当您在一个键(例如A)下操作列表时,您实际上对所有键下存储的列表进行了相同的更改,因为它是所有三个键的SAME列表。

上面描述了对此的修复,但基本上你想为地图中的每个键创建一个新的List实例。

答案 1 :(得分:2)

您可能在Map的所有值中放置了相同的List。但是,这种情况发生在您未显示的代码中。当您第一次在地图中放置一个键时,请确保为其值创建一个新列表。