spring下的beanutils.copyProperties实现深拷贝

spring下的beanutils.copyProperties方法是深拷贝还是浅拷贝?可以实现深拷贝吗?

答案:浅拷贝。

一、浅拷贝深拷贝的理解

简单说拷贝就是将一个类中的属性拷贝到另一个中,对于BeanUtils.copyProperties来说,你必须保证属性名和类型是相同的,因为它是根据get和set方法来赋值的。
1.1、浅拷贝 浅拷贝可以理解为如果是引用类型,那么目标对象拷贝的只是源对象的地址,无论目标对象还是源对象改变,他们都会一起改变 。
1.2、深拷贝 深拷贝就是将目标对象的属性全部复制一份给源对象,复制完之后他们就是隔开的,没有任何关系,无论操作源对象还是目标对象都对另一个没有影响 无论是浅拷贝还是深拷贝,对于基本类型和String来说都是没有影响的,有影响的只有引用类型数据。

二、测试beanutils.copyProperties为浅拷贝

建两个实体类

public class CityBean {String value;.......// 省略get和set方法,Alt+insert很快的
}
public class FastdfsTest {private String id;private String name;private String size;private CityBean cityBean;.......// 省略get和set方法,Alt+insert很快的

测试:

@Testpublic void testObjectMapper() throws IOException, MyException {// 源类FastdfsTest source = new FastdfsTest();source.setId("fastdfsTest");source.setName("fastdfsTest");source.setSize("fastdfsTest");CityBean cityBean = new CityBean();cityBean.setValue("CityBean源值");source.setCityBean(cityBean);// 目标类FastdfsTest target = new FastdfsTest();// 把fastdfsTest中所有的属性都复制到fastdfsTestCopy中,即使是cityBean也会被复制BeanUtils.copyProperties(source,target);CityBean sourceCity = source.getCityBean();//在下面改变源类的引用数据,如果BeanUtils.copyProperties是浅拷贝,那么目标类拷贝的就是一个引用地址;源类改变目标类也会跟着改变//如果BeanUtils.copyProperties是深拷贝,则两边改变都不会相互影响sourceCity.setValue("CityBean目标值");System.out.println(source.toString() == target.toString());}

测试截图:
这里可以看出BeanUtils.copyProperties是一个浅拷贝:
在这里插入图片描述

三、如何用beanutils.copyProperties实现深拷贝

测试代码

/*** 测试stream中用BeanUtils.copyProperties是否是深拷贝*/@Testpublic void testStream(){// 我从数据库查的,其实就是创建几个数据,这里就自己添加了哈List<FastdfsTest> fastdfsTestList = fastdfsTestService.selectFastdfsTestList();// 先构造fastdfsTestList = fastdfsTestList.stream().map(k -> {CityBean cityBean = new CityBean();cityBean.setValue("新的value");k.setCityBean(cityBean);return k;}).collect(Collectors.toList());// 拷贝List<FastdfsTest> fastdfsTestList2 = fastdfsTestList.stream().map(k -> {FastdfsTest fastdfsTest = new FastdfsTest();BeanUtils.copyProperties(k,fastdfsTest);return fastdfsTest;}).collect(Collectors.toList());// 设置源对象引用字段为空fastdfsTestList.get(0).setCityBean(null);System.out.println(fastdfsTestList + "==userDTOList==" + fastdfsTestList2);}

测试截图
在这里插入图片描述
这里可以看到改变源对象是不会影响目标对象的,因此可以借助java8的一些stream新特性,用BeanUtils.copyProperties这个方法来实现深拷贝(任意两个类都可以哦)

深拷贝模板

// 拷贝List<目标类型> target= source.stream().map(k -> {目标类型 xxx= new 目标类型();BeanUtils.copyProperties(k,xxx);return xxx;}).collect(Collectors.toList());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35923.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux---对缓冲区的简单理解--第一个系统程序

前序&#xff1a; 首先先理解一下什么是回车与换行&#xff1b;回车和换行是两个概念&#xff0c;它们不是一个东西&#xff1b; 回车:光标回到开始&#xff1b;换行:换到下一行&#xff1b; 如下图&#xff1a; 行缓冲区 如何理解缓冲区问题&#xff1f; 可以认为&#xff0…

『RabbitMQ』 windows下 安装RabbitMQ 并在Python中使用测试

目录 1. 安装ERLANG2. 安装RabbitMQ3. 新建用户Python的测试代码 生产者和消费者总结欢迎关注 『RabbitMQ』 专栏,持续更新中 欢迎关注 『RabbitMQ』 专栏,持续更新中 1. 安装ERLANG 下载之前先看兼容性,这里我打算下载26.1版本的Erlang以适配RabbitMQ cloud.emqx.com/cons…

【教程】创建NVIDIA Docker共享使用主机的GPU

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 这套是我跑完整理的。直接上干货&#xff0c;复制粘贴即可&#xff01; # 先安装toolkit sudo apt-get update sudo apt-get install -y ca-certifica…

麒麟信安受邀参加重庆教育装备专家培训会,共探教育信息化发展新趋势

近日&#xff0c;重庆市教育装备协会2024年区教育装备专家培训会举行&#xff0c;重庆各区教育信息技术与装备中心、教育委员会等相关领导参加。会上&#xff0c;麒麟信安作为协会成员单位发表主题演讲&#xff0c;与参会嘉宾深入探讨教育信息化工作的创新做法和实践经验&#…

2025澄迈漓岛音乐节品牌招商大会成功举行

——共谋音乐盛事&#xff0c;携手推动文化经济发展 12月6日&#xff0c;“2025澄迈漓岛音乐节品牌招商大会”&#xff08;以下简称“招商大会”&#xff09;在澄迈举行。本次大会由澄迈福山发展有限公司、福山咖啡文化风情镇旅游区联合主办&#xff0c;海南绿发投资有限公司承…

从零开始学TiDB(1) 核心组件架构概述

首先TiDB深度兼容MySQL 5.7 1. TiDB Server SQL语句的解析与编译&#xff1a;首先一条SQL语句最先到达的地方是TiDB Server集群&#xff0c;TiDB Server是无状态的&#xff0c;不存储数据&#xff0c;SQL 发过来之后TiDB Server 负责 解析&#xff0c;优化&#xff0c;编译 这…

调度算法的评价指标

调度算法的评价指标 一、CPU利用率二、系统吞吐量三、周转时间四、等待时间五、响应时间 一、CPU利用率 C P U 的利用率 C P U 有效工作时间 C P U 有效工作时间 C P U 空闲等待时间 CPU的利用率\dfrac{CPU有效工作时间}{CPU有效工作时间CPU空闲等待时间} CPU的利用率CPU有效…

【SpringBoot】SpringBoot中分页插件(PageHelper)的使用

目录 1.分页概念 2.原生写法 3.PageHelper插件分页查询 3.1 介绍 3.2?使用 3.3 Page对象和PageInf对象 1.分页概念 用户查询的数据不可能一次性全部展示给用户&#xff08;如果用户有一万条数据呢&#xff09;&#xff0c;而是分页展示给用户&#xff0c;这就是分页查询…

python操作数据库

文章目录 基础使用数据插入 基础使用 python使用第三方库pymysql来操作mysql数据库 安装&#xff1a; pip install pymysqlfrom pymysql import Connection# 获取到MySQL数据库的链接对象conn Connection(hostlocalhost # 主机名,port3306 # 端口&#xff0c;默…

【01】栅格切片服务发布

本文探讨的是使用GeoScene Server本身的能力去切瓦片&#xff0c;它可以很好地通过server自带的CachingTools GP服务去切片&#xff0c;可以通过调整该gp服务的最大实例数能够更好利用server所在机器cpu的能力&#xff1b; 如果server站点已经发布了很多服务&#xff0c;则不建…

非极大值抑制(Non-Maximum Suppression,简称NMS)是什么?

非极大值抑制&#xff08;Non-Maximum Suppression&#xff0c;简称NMS&#xff09;是一种常用于目标检测任务中的后处理技术&#xff0c;主要用于从多个候选框中选出最合适的边界框&#xff0c;并抑制那些与最优候选框重叠度高且分类置信度低的框。 NMS的目的&#xff1a; 在…

【Java】A *算法的应用

代码和测试图片下载地址&#xff1a; https://download.csdn.net/download/r77683962/90089371 这个地图里黑色部分是不能通过的&#xff0c;白色部分是可以通过的&#xff0c;这个算法没问题&#xff0c;有点感觉效率不太高。。。。。 效果&#xff1a; 源代码PathFind.java&…

日本IT|企业需要什么样的技术?

日本IT企业所需的技术非常多样化&#xff0c;涵盖了多个领域和方面。以下是一些日本IT企业通常所需的主要技术&#xff1a; 一、编程语言与工具 编程语言&#xff1a;Java、Python、C、C#、PHP等是日本IT企业常用的编程语言。这些语言在软件开发、数据分析、网络应用等方面都…

刘铁猛C#入门 030 泛型,partial类,枚举,结构

泛型(generic)无处不在 为什么需要泛型&#xff1a;避免成员膨胀或者类型膨胀 正交性&#xff1a;泛型类型(类/接口/委托/......)泛型成员(属性/方法/字段/....类型方法的参数推断 泛型接口/类的 类型参数不只有一个泛型与委托、lambda表达式实现泛型接口类时 &#xff0c;实现…

视频加密的好处与加密方法分析2024

视频内容的多样化不止局限于电视、电影&#xff0c;在日常培训学习中也是必不可少的。那么对于做知识付费的人来说&#xff0c;视频内容的安全性就尤为重要。视频加密也就i随之兴起&#xff0c;为视频内容安全多了一层保障&#xff0c;那么主要体现下那几个方面呢&#xff1f;可…

鸿蒙UI开发——亮/暗色模式适配

1、概 述 系统存在深浅色两种显示模式&#xff0c;为了给用户更好的使用体验&#xff0c;应用最好适配暗色和亮色两种模式。从应用与系统配置关联的角度来看&#xff0c;适配暗色和亮色模式可以分为下面两种情况&#xff1a; 应用跟随系统的深浅色模式&#xff1b; 应用主动设…

三菱伺服JET产品线(选型说明)

伺服放大器功能提升 伺服放大器MELSERVO-JET系列为进一步优化了独家控制引擎的高性能伺服放大器。 可通过与支持CC-LinK IE TSN的运动控制器的同步通信,进行高 速、高精度的运动控制。 除了旋转型伺服电机以外,还支持线性伺服电机。MR-JET-G-N1支持EtherCAT。 旋转型伺服电机 …

HarmonyNext如何判断上下分屏

鸿蒙系统支持上下分屏&#xff0c;可以同时使用两个应用&#xff0c;比如&#xff1a; 有时候我们需要在分屏的时候处理相关逻辑&#xff0c;那到底该如何处理了&#xff0c; 首先在UIAbility下的onWindowStageCreate中进行监听 //监听窗口变化let windowClass: window.Window…

寄存器点灯

1.keil创建工程。&#xff08;不再概述&#xff09; 2.需要添加启动文件。所以添加库文件中的第二个。 3.启动顺序。上电后先初始化堆栈指针&#xff0c;再运行该汇编&#xff0c;最后跳入main函数&#xff0c;系统初始化是初始化时钟的&#xff0c;暂时不需要&#xff0c;屏蔽…

tomcat 运行加载机制解析

tomcat 运行加载机制 从tomcat jar包的加载顺序&#xff1a; tomcat的具体运行加载 可以从 start、setclasspath、catalina文件中看出来&#xff1a; start.bat执行 去找bin目录下的catalina.bat,catalina 或去找 bin\setenv.bat以获取标准环境变量&#xff0c;然后去找bin\…