浅谈Java浅拷贝和深拷贝

拈花ヽ惹草 提交于 2019-12-13 16:13:40

【推荐】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等;

浅拷贝:复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化;

深拷贝:将对象及值复制过来,两个对象修改其中任意的值另一个值不会变化。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!