[英]Changing value in HashMap 2 changes the value in HashMap 1
我有我的代码,
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个答案。 他们都接近正确的答案。 我选择了最佳答案。
map1和map2都包含相同的列表。 它们都包含对同一列表的引用。 因此,如果列表被修改,更改将反映在两个地图中。
map1 -------------->t1<----------------map2
如果希望他们拥有列表的单独副本,请创建一个新列表。
map1 -------------->t1
map2 -------------->t1` //where t1` is a new copy of t1
更改:
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副本,您需要创建一个具有相同数据的新列表。 就像上面的for循环一样。
您是浅复制和深复制之间差异的受害者。
浅拷贝应尽可能少地重复。 集合的浅表副本是集合结构的副本,而不是元素。 使用浅表副本,现在两个集合共享各个元素。
深层副本会复制所有内容。 集合的深层副本是两个集合,原始集合中的所有元素都重复了。
行“ 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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.