【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
浅谈Java浅拷贝和深拷贝
案例
最近做的项目中,有一个需要重构数据结构的模块。将数据库查询的数据转换成指定格式并排序的嵌套map结构,如下
由于数据中包含大量的重复结构,结合空间复杂度和时间复杂度,博主准备根据排序规则先制作一个标准结构单元

然后在重构大量的数据时,只需要拷贝一份。 根据固定的key ,填充对应的value值即可。在拷贝的时候 用到了 list 的addAll()方法
@GetMapping("/test1")
public String testCopy() {
List<Map<String, String>> list1 = new ArrayList<>();
Map<String, String> map1 = new HashMap<>();
Map<String, String> map2 = new HashMap<>();
map1.put("姓名", "张三");
map2.put("年龄", "18");
list1.add(map1);
list1.add(map2);
List<Map<String, String>> list2 = new ArrayList<>();
list2.addAll(list1);
Map<String,List<Map<String, String>>> resultMap = new HashMap<>();
resultMap.put("A班", list1);
resultMap.put("B班", list2);
return JSON.toJSONString(resultMap);
}
效果如下:

后来发现,list中的addAll()方法是浅拷贝
解决办法:
private List<Map<String, String>> deepCopy(List<Map<String, String>> list) {
List<Map<String, String>> copyList = new ArrayList<>();
list.forEach(stringStringMap -> {
Map<String, String> map = new HashMap<>();
Set<String> keys = stringStringMap.keySet();
String key = keys.iterator().next();
Collection<String> values = stringStringMap.values();
String value = values.iterator().next();
map.put(key, value);
copyList.add(map);
});
return copyList;
}

浅拷贝 和深拷贝定义
Java中数据类型分为:
一、基本数据类型,int long boolean 等;
二、引用类型,object 对象 Collection Map等;
浅拷贝:复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化;
深拷贝:将对象及值复制过来,两个对象修改其中任意的值另一个值不会变化。
来源:oschina
链接:https://my.oschina.net/tcwong/blog/3142652