浅拷贝与深拷贝是对象复制的两种方式;
浅拷贝
定义
创建一个新的对象,基础数据类型属性复制值,引用数据类型属性复制引用地址(共享一个实例)
特点
当修改原数据的引用数据类型属性的值时,新数据的引用数据类型属性值也会随之变化
案例介绍
import lombok.Data;
@Data
public class Student implements Cloneable {
private String name;
private int age;
private Address address;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
import lombok.Data;
@Data
public class Address {
private String sheng;
private String shi;
private String qu;
}
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class CopyDemo {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address();
address.setSheng("湖北省");
address.setShi("武汉市");
address.setQu("洪山区");
Student student = new Student();
student.setName("张三");
student.setAge(18);
student.setAddress(address);
//浅拷贝对象(需要对象实现Cloneable接口,重写clone方法)
Student cloneStudent = (Student)student.clone();
log.info("修改前_student={}",student);//修改前_student=Student(name=张三, age=18, address=Address(sheng=湖北省, shi=武汉市, qu=洪山区))
log.info("修改前_cloneStudent={}",cloneStudent);//修改前_cloneStudent=Student(name=张三, age=18, address=Address(sheng=湖北省, shi=武汉市, qu=洪山区))
address.setQu("武昌区");//修改引用数据类型的值
log.info("修改后_student={}",student);//修改后_student=Student(name=张三, age=18, address=Address(sheng=湖北省, shi=武汉市, qu=武昌区))
log.info("修改后_cloneStudent={}",cloneStudent);//修改后_cloneStudent=Student(name=张三, age=18, address=Address(sheng=湖北省, shi=武汉市, qu=武昌区))
}
}
深拷贝
定义
创建一个新的对象,基础数据类型属性复制值,引用数据类型属性会创建一个新的对象,引用新的地址
特点
当修改原数据的引用数据类型属性的值时,新数据的引用数据类型属性值不会变化
案例介绍
import lombok.Data;
import java.io.Serializable;
@Data
public class Student implements Serializable {
private String name;
private int age;
private Address address;
}
import lombok.Data;
import java.io.Serializable;
@Data
public class Address implements Serializable {
private String sheng;
private String shi;
private String qu;
}
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.SerializationUtils;
@Slf4j
public class CopyDemo {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address();
address.setSheng("湖北省");
address.setShi("武汉市");
address.setQu("洪山区");
Student student = new Student();
student.setName("张三");
student.setAge(18);
student.setAddress(address);
byte[] serialize = SerializationUtils.serialize(student);//序列化
Student cloneStudent = (Student)SerializationUtils.deserialize(serialize);//反序列化
log.info("修改前_student={}",student);//修改前_student=Student(name=张三, age=18, address=Address(sheng=湖北省, shi=武汉市, qu=洪山区))
log.info("修改前_cloneStudent={}",cloneStudent);//修改前_cloneStudent=Student(name=张三, age=18, address=Address(sheng=湖北省, shi=武汉市, qu=洪山区))
address.setQu("武昌区");//修改引用数据类型的值
log.info("修改后_student={}",student);//修改后_student=Student(name=张三, age=18, address=Address(sheng=湖北省, shi=武汉市, qu=武昌区))
log.info("修改后_cloneStudent={}",cloneStudent);//修改后_cloneStudent=Student(name=张三, age=18, address=Address(sheng=湖北省, shi=武汉市, qu=洪山区))
}
}
BeanUtil.copyProperties属于浅拷贝