我有我的代码,
HashMap<String, ArrayList<String>> map1 = new HashMap<String, ArrayList<String>>();
HashMap<String, ArrayList<String>> map2 = new HashMap<String, ArrayList<String>>();
ArrayList<String> t1= new ArrayList<String>();
t1.add("a");t1.add("a");
t1.add("a");t1.add("a");t1.add("a");
map1.put("1", t1);
System.out.print("Map1: "+map1.toString());
map2.putAll(map1);
System.out.print("Map2: "+map1.toString());
map2.get("1").set(0, "b");
System.out.print("Map1: "+map1.toString()+" | "+"Map2: "+map2.toString());
更改map2中的值时,会更改map1中的值。 请尽快帮我解决这个问题。
由于
编辑:我们这里有3个答案。所有这些都接近正确的答案。我选择了最好的答案。
答案 0 :(得分:4)
map1和map2都包含相同的列表。它们都包含对同一列表的引用。因此,如果列表被修改,则更改将反映在两个地图中。
map1 -------------->t1<----------------map2
如果您希望他们拥有列表的单独副本,请创建一个新列表。
map1 -------------->t1
map2 -------------->t1` //where t1` is a new copy of t1
答案 1 :(得分:1)
变化:
map2.putAll(map1);
为:
map2.put("1",new ArrayList<String>(l1));
修改强>
for(Map.Entry<String, ArrayList<String>> entry: map1.entrySet()){
map2.put(entity.getKey(),new ArrayList<String>(entity.getValue()));
}
问题是你在地图中都使用了相同的arraylist副本,因此无论你在哪个地图中更改值都无关紧要,两者都会发生变化。
要在地图的每个项目中制作2个单独的arraylist副本,您需要创建具有相同数据的新列表。就像上面的循环一样。
答案 2 :(得分:1)
您是浅拷贝和深拷贝之间差异的受害者。
浅拷贝尽可能少复制。集合的浅表副本是集合结构的副本,而不是元素。使用浅拷贝,两个集合现在共享各个元素。
深拷贝复制一切。集合的深层副本是两个集合,原始集合中的所有元素都是重复的。
“map2.putAll(map1);”这一行基本上创建一个浅拷贝, map1和map2共享对同一数据的引用 。如果您希望它们完全不同,建议您复制所有内容。一种可能的方法是使用MapEntry并手动复制每个记录。
HashMap<String, ArrayList<String>> map1 = new HashMap<String, ArrayList<String>>();
HashMap<String, ArrayList<String>> map2 = new HashMap<String, ArrayList<String>>();
ArrayList<String> t1 = new ArrayList<String>();
t1.add("a");
t1.add("a");
t1.add("a");
t1.add("a");
t1.add("a");
map1.put("1", t1);
for (Map.Entry<String, ArrayList<String>> entry : map1.entrySet()) {
map2.put(entry.getKey(), new ArrayList<String>());
for(String s: entry.getValue()) {
map2.get(entry.getKey()).add(s);
}
}
System.out.println("Map1: " + map1.toString());
System.out.println("Map2: " + map1.toString());
map2.get("1").set(0, "b");
System.out.println("Map1: " + map1.toString() + " | " + "Map2: " + map2.toString());