Java中的深拷贝与浅拷贝
据在复制原型对象的同时是否复制包含在原型对象中引用类型的成员变量 这个条件,原型模式的克隆机制分为两种,即浅克隆(Shallow Clone)和深克隆(Deep Clone)
浅克隆
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象(克隆对象与原型对象共享引用数据类型变量)。
深拷贝
除去那些引用其他对象的变量,被复制对象的所有变量都含有与原来的对象相同的值。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍
总结
- 可以在Java中通过实现Cloneable,克隆标记接口的方式获得浅拷贝的能力
- 要是想实现深拷贝可以通过重写clone方法,即可以通过在原有浅拷贝是通过二进制形式进行对引用数据类型进行克隆的方式,人为的将地址clone一次。
- 深拷贝可以通过序列化反序列话的方式进行
BeanUtils.copyProperties()的作用
BeanUtils.copyProperties() 是 Apache Commons BeanUtils 库中的一个方法,用于将一个 Java 对象的属性值复制到另一个 Java 对象中。
具体来说,该方法可以将一个 Java 对象的属性值(getter 方法返回的值)复制到另一个 Java 对象中对应的属性(setter 方法设置的值)。可以通过该方法将一个对象的属性值复制到另一个对象中,而不需要手动编写属性的赋值代码。
该方法通常用于 DTO(Data Transfer Object)和实体对象之间的属性赋值。在 DTO 和实体对象之间进行数据传输时,使用该方法可以避免手动编写属性赋值代码,提高开发效率。
下面是一个示例:
public class SourceObject { private String name; private int age; // getter and setter methods omitted for brevity } public class TargetObject { private String name; private int age; // getter and setter methods omitted for brevity } // Create a source object with some values SourceObject source = new SourceObject(); source.setName("舒一笑"); source.setAge(30); // Create a target object TargetObject target = new TargetObject(); // Copy the values from the source object to the target object BeanUtils.copyProperties(target, source); // The target object now has the same values as the source object System.out.println(target.getName()); // "舒一笑" System.out.println(target.getAge()); // 30