繁体   English   中英

在HashMap 2中更改值会在HashMap 1中更改值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM