• Java-List<Map>的复制 深拷贝与浅拷贝


    博客背景是Java开发。讲一讲List< Map>的复制中深拷贝与浅拷贝。

    1、浅拷贝

    Map除了基本类型是值传递,其余的都是引用地址传递。
    由于map的value存储的引用地址传递(list),所以当list对象的内部属性发生改变时,map中的value随着改变,该方式属于浅拷贝。

    举个例子:list1浅拷贝成list2,Java中内容相同的数组指向同一地址,即list1与浅拷贝后的list2指向同一地址。这样会带来的影响在于如果改变list2的话,同时也会改变list1。因为改变list2就是改变其所指向地址的内容,而list1也指向同一地址,所以list1与list2会一起改变。

    如下代码示例,有三种方式可以实现浅拷贝:

    1.1循环遍历复制

    //方法一:循环遍历复制
    List<Map<String, Object>> list2 = new ArrayList<>(list1.size());
    for (Map<String, Object> map : list1) {
        listt2.add(map);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.2 使用list实现类的构造方法

    //方法二:使用list实现类的构造方法
    List<Map<String, Object>> list2 = new ArrayList<>(list1);
    
    • 1
    • 2

    1.3 addAll方法

    //方法三:使用addAll
    List<Map<String, Object>> list2 = new ArrayList<>();
    list2.addAll(list1);
    
    • 1
    • 2
    • 3

    2、深拷贝

    如果不想改变原map中的值,可以使用反射原理做深拷贝处理。其原理是在内存中开辟一块新的内存地址,所以不会改变旧地址上的值。

    举个例子,深拷贝是将list1复制给list2的同时,给list2创建新的地址,再将list1地址的内容传递到list2地址。这样就会使得list1与list2的内容一致,但由于他们所指向的地址不同,所以改变相互不受影响。

    深拷贝工具类 SerializationUtils.clone

    commons-lang-2.6.jar
    例如:Object obj = SerializationUtils.clone( objectFrom )
    
    • 1
    • 2

    代码示例如下,使用深拷贝工具类实现

    List<HashMap<String, Object>> list2 = new ArrayList<>();
    for (Map<String, Object> hashMap : list1) {
        list2.add((HashMap<String, Object>) SerializationUtils.clone((Serializable) hashMap));
    }
    
    • 1
    • 2
    • 3
    • 4

    参考:
    https://blog.csdn.net/VIP099/article/details/108633345
    https://blog.csdn.net/shy415502155/article/details/106048557/

  • 相关阅读:
    第20章 使用Spring进行事务管理(一)
    Arbitrum:二维费用
    毫米波技术基础
    Lua语法之简单变量
    vue项目中element-ui对话框el-dialog嵌套显示时多了一个遮罩层解决办法
    Web Tour Server窗口闪现
    P1510 精卫填海(01背包)
    websocket学习笔记1
    yxy销售网站后台管理系统
    大白话JS中Object.entires()和Object.assign()的使用
  • 原文地址:https://blog.csdn.net/weixin_44436677/article/details/132916180