Hashmap对所有键显示相同的值

时间:2018-08-08 13:11:22

标签: java arraylist hashmap

我有一个非常简单的代码用arrayList填充哈希图。以下是代码段

HashMap<String, ArrayList<String> > fieldValue = new HashMap<String, ArrayList<String>>();
ArrayList<String> tmp = new ArrayList<>();

tmp.add("f");
tmp.add("string");
tmp.add("false");
fieldValue.put("bas", tmp);

tmp.clear();
tmp.add("f");
tmp.add("string");
tmp.add("false");
fieldValue.put("usc", tmp);

tmp.clear();
tmp.add("f");
tmp.add("int");
tmp.add("false");
fieldValue.put("st", tmp);

for (Map.Entry r : fieldValue.entrySet()) {
    System.out.println(r.getKey() + "\t" + r.getValue());
}

以下是我执行时的输出

st  [f, int, false]
usc [f, int, false]
bas [f, int, false]

问题出在哪里?我曾期望hashmap值中存在不同的值,但它们都是相同的。我想念什么吗?

2 个答案:

答案 0 :(得分:2)

代码

fieldValue.put(..., tmp);

克隆列表tmp,它只是将对列表的引用作为值放入地图中。

所以最后您在地图上有了列表的 last 内容。

您不应不要回收tmp变量,但应始终创建一个 new 独立列表。

答案 1 :(得分:1)

tmp.clear();仅从集合中删除数据。但是您仍将同一对象tmp用于不同的键。如上所述,您必须创建一个新集合new ArrayList(tmp)