深拷贝和浅拷贝的区别
- 浅拷贝:只是调用子对象的set方法,并没有将所有属性拷贝。(也就是说,引用的一个内存地址)
- 深拷贝:将子对象的属性也拷贝过去。
BeanUtils.copyProperties是根据什么来匹配拷贝的?
1、根据属性的类型和定义的属性名字
以下两种情况都不会进行拷贝
只有属性的类型和定义的属性名字均对应是才会进行拷贝
BeanUtils.copyProperties是深拷贝还是浅拷贝?具体得看拷贝的对象里面成员变量是否包含对其它对象的引用
拷贝的对象里面的成员变量引用了其它对象时和基本数据类型的区别
CustomPopup类
@Data
public class CustomPopup {
private String buttonImageUrl;
List<CustomPopupPo> langImageUrlInput;
}
MyCustomPopup类
@Data
public class MyCustomPopup {
private String buttonImageUrl;
List<CustomPopupPo> langImageUrlInput;
}
test类
@Test
public void demo6(){
CustomPopup customPopup = new CustomPopup();
MyCustomPopup myCustomPopup = new MyCustomPopup();
customPopup.setButtonImageUrl("123");
List<CustomPopupPo> customPopupPoList = new ArrayList<>();
CustomPopupPo customPopupPo = new CustomPopupPo();
customPopupPoList.add(customPopupPo);
customPopup.setLangImageUrlInput(customPopupPoList);
BeanUtils.copyProperties(customPopup,myCustomPopup);
customPopup.setButtonImageUrl("321");
System.out.println(customPopup.getLangImageUrlInput().hashCode());
System.out.println(myCustomPopup.getLangImageUrlInput().hashCode());
System.out.println(customPopup.getButtonImageUrl());
System.out.println(myCustomPopup.getButtonImageUrl());
System.out.println(customPopup.getButtonImageUrl().hashCode());
System.out.println(myCustomPopup.getButtonImageUrl().hashCode());
}
结果
可以看到拷贝前后两个对象的引用对象的成员变量langImageUrlInput的哈希值是一样的,说明引用的是同一个对象,是浅拷贝。
而基本数据类型的成员变量buttonImageUrl拷贝前后的哈希值不一致,说明是深拷贝。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/125123.html