深拷贝和浅拷贝的区别
- 浅拷贝:只是调用子对象的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拷贝前后的哈希值不一致,说明是深拷贝。