我有一个非常简单的代码用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值中存在不同的值,但它们都是相同的。我想念什么吗?
答案 0 :(得分:2)
代码
fieldValue.put(..., tmp);
不不克隆列表tmp
,它只是将对列表的引用作为值放入地图中。
所以最后您在地图上有了列表的 last 内容。
您不应不要回收tmp
变量,但应始终创建一个 new 独立列表。
答案 1 :(得分:1)
tmp.clear();
仅从集合中删除数据。但是您仍将同一对象tmp
用于不同的键。如上所述,您必须创建一个新集合new ArrayList(tmp)
。