重庆江北网站建设,免费 网站 cms,辽宁建设工程信息网审计报告,用什么软件做网站布局spring下的beanutils.copyProperties方法是深拷贝还是浅拷贝#xff1f;可以实现深拷贝吗#xff1f;
答案#xff1a;浅拷贝。
一、浅拷贝深拷贝的理解
简单说拷贝就是将一个类中的属性拷贝到另一个中#xff0c;对于BeanUtils.copyProperties来说#xff0c;你必须保…spring下的beanutils.copyProperties方法是深拷贝还是浅拷贝可以实现深拷贝吗
答案浅拷贝。
一、浅拷贝深拷贝的理解
简单说拷贝就是将一个类中的属性拷贝到另一个中对于BeanUtils.copyProperties来说你必须保证属性名和类型是相同的因为它是根据get和set方法来赋值的。 1.1、浅拷贝 浅拷贝可以理解为如果是引用类型那么目标对象拷贝的只是源对象的地址无论目标对象还是源对象改变他们都会一起改变 。 1.2、深拷贝 深拷贝就是将目标对象的属性全部复制一份给源对象复制完之后他们就是隔开的没有任何关系无论操作源对象还是目标对象都对另一个没有影响 无论是浅拷贝还是深拷贝对于基本类型和String来说都是没有影响的有影响的只有引用类型数据。
二、测试beanutils.copyProperties为浅拷贝
建两个实体类
public class CityBean {String value;.......// 省略get和set方法Altinsert很快的
}public class FastdfsTest {private String id;private String name;private String size;private CityBean cityBean;.......// 省略get和set方法Altinsert很快的测试
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(){// 我从数据库查的其实就是创建几个数据这里就自己添加了哈ListFastdfsTest fastdfsTestList fastdfsTestService.selectFastdfsTestList();// 先构造fastdfsTestList fastdfsTestList.stream().map(k - {CityBean cityBean new CityBean();cityBean.setValue(新的value);k.setCityBean(cityBean);return k;}).collect(Collectors.toList());// 拷贝ListFastdfsTest 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());