Java中Map引用赋值后修改新变量影响原变量的解决方法咨询
解决Java中Map引用复制导致同步修改的问题
这问题我刚接触Java集合的时候也踩过一模一样的坑!你遇到的核心问题是**prNew = pr并没有创建新的Map对象,只是把原Map的引用赋值给了新变量**——也就是说,pr和prNew其实指向内存里同一个HashMap实例,不管你通过哪个变量修改,本质上都是在操作同一个对象,所以原Map也会跟着变。
要避免这种情况,你需要创建一个独立的新Map实例,把原Map的键值对复制进去,下面是几种常用的方法:
方法1:使用HashMap的拷贝构造函数
这是最简洁直接的方式,HashMap自带的构造函数可以接收一个已有的Map,自动复制里面的所有键值对:
Map<String,String> pr = new HashMap<>(); pr.put("ab","ab"); pr.put("xy","xy"); // 创建新的Map实例,复制原Map的内容 Map<String,String> prNew = new HashMap<>(pr); prNew.remove("ab"); System.out.println(pr); // 输出 {ab=ab, xy=xy}(原Map不受影响) System.out.println(prNew); // 输出 {xy=xy}
方法2:使用putAll()方法
如果已经创建了空的Map实例,可以用putAll()把原Map的内容批量复制进去,效果和拷贝构造函数一致:
Map<String,String> pr = new HashMap<>(); pr.put("ab","ab"); pr.put("xy","xy"); Map<String,String> prNew = new HashMap<>(); prNew.putAll(pr); // 复制原Map的所有键值对到新Map prNew.remove("ab"); // 同样能得到预期的输出
额外注意点
如果你的Map中存储的value是自定义对象(不是String这种不可变类型),上面的方法属于「浅拷贝」——新Map里的value还是指向原对象的引用,修改这些对象的属性还是会影响原Map。这种情况下你需要实现「深拷贝」,比如手动复制对象的每个属性,或者用序列化/反序列化的方式生成全新的对象实例。不过你当前的场景用String作为value,完全不用担心这个问题~
内容的提问来源于stack exchange,提问作者CodePlorer
相关产品推荐
相关产品推荐

