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

2023-09-16 11:42:15

博客背景是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 使用list实现类的构造方法

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

1.3 addAll方法

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

2、深拷贝

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

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

深拷贝工具类 SerializationUtils.clone

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

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

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

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

更多推荐

pgsql 主从搭建

在PostgreSQL中,主从复制(Master-SlaveReplication)是一种常见的数据库高可用性和数据备份解决方案。它允许你创建一个主数据库服务器(Master),并在一个或多个从数据库服务器(Slave)上复制主数据库的数据。这有助于提高系统的可用性,因为在主服务器发生故障时,可以切换到从服务器来提供服

人大女王大学金融硕士——人生的每一刻,都是在为自己的明天铺垫

随着社会经济的迅速发展,经济全球化不断扩大。许多学子想要体验到更加多元化的教育,却又不想出国,那么中外合作办学硕士便是最好的方式。作为金融人士的你,不妨看看中国人民大学与加拿大女王大学合办的金融硕士项目,或许会给你带来全新的体验。什么是中外合作办学硕士?中外合作办学硕士是依据中外合作办学条例及教育部相关规章和文件,由中

linux入门到精通-第三章-vi(vim)编辑器

目录文本编辑器gedit介绍vi(vim)命令模式命令模式编辑模式末行模式帮助教程保存文件切换到编辑模式光标移动(命令模式下)复制粘贴删除撤销恢复保存退出查找替换可视模式替换模式分屏其他用法配置文件文本编辑器gedit介绍gedit是一个GNOME桌面环境下兼容UTF-8的文本编辑器。它使用GTK+编写而成,它十分的简

HTTP 协商缓存 Last-Modified,If-Modified-Since

浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在responeheader加上Last-Modified属性(表示这个资源在服务器上的最后修改时间):-----------------------------------------------------------------------------

如何使用jenkins、ant、selenium、testng搭建自动化测试框架

如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入,然后写一些测试脚本,这就是你所说的自动化测试,其实这个还不能算是真正的自动化测试,你见过每次需要运行的时候还需要打开eclipse然后去选择运行文件吗?没有吧!应为那样真的是很low的!下面说一下经理的两种自动化测试:一、将脚本写好,放在服

【Redis】redis实现限流

【Redis】redis实现限流【一】固定窗口【二】滑动窗口【三】令牌桶【四】深入分析Zset的数据结构【一】固定窗口所谓固定窗口限流就是时间窗口的起始和节数时间是固定的,在固定时间段内允许要求的请求数量访问,超过这个数量就会拒绝;当固定时间段结束后,再重新开始下一个时间段进行计数。我们可以根据当前的时间,以分钟为时间

PHP8中的构造方法和析构方法-PHP8知识详解

今日分享的内容是php8中的构造方法和析构方法,我们把构造方法和析构方法这两个方法分开来讲:1、构造方法构造方法存在于每个声明的类中,主要作用是执行一些初始化任务。如果类中没有直接声明构造方法,那么类会默认地生成一个没有参数且内存为空的构造方法。在PHP8中,构造方法的方法名称必须是两个下划线开头的,即“__const

Java多线程编程-线程间协作wait/notify

前言:本文是基于《Java多线程编程实战指南》第五章个人理解,源码是摘抄作者的源码,源码会加上自己的理解。等待与通知:wait/notify单线程的变成中,如果程序需要在满足一定条件间下操作一个目标动作,就需要if语句,而在多线程中处理这种情况,保护条件可能只是暂时的,稍后其他线程可能更新了保护条件设计共享变量而使其成

如何通过快解析测试接口内外网?本地内网ip让外网访问连接

接口调试测试是网络技术员经常工作内容之一。如在公司内部api项目webserver测试,在公司内办公室个人电脑是正常用内网IP访问连接测试的,但在外网电脑需要远程测试时需要怎么测试呢?这里提供一种内网地址让外网访问的通用方法:快解析内网映射。内网地址在外网访问的原理主要是通过快解析软件方式,将本地内网地址转换成外网可以

adb操作及常用命令

问题:nodevices/emulatorsfound:adbdevices没有连接的设备解决方案:大概率是因为usb调试功能没有打开,可以查看手机设备是否开启usb调试功能Android若未开启,可通过设置-关于手机,连续点击版本号7次,打开开发者模式后开启usb调试常用命令汇总查看连接计算机的设备:adbdevic

基于SpringBoot+Vue的旅游管理系统

目录前言一、技术栈二、系统功能介绍登录界面管理员功能模块用户功能模块三、核心代码1、登录模块2、文件上传模块3、代码封装前言随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,旅游网站当然也不能排除在外,随着旅游网站的不断成熟,它彻底改变了过去传统的旅游网站方式,不仅使旅游管理难度变

热文推荐