一、区别
1. 深拷贝中既要拷贝基本数据类型也要拷贝引用类型的数据,也就是说拷贝一份完全一样的对象。
2. 浅拷贝中之拷贝基本数据类型,引用类型的数据只是拷贝了原来的引用,并没有把引用的数据也拷贝。
二、方式
1. 深拷贝的一般需要序列化对象,然后根据流进行复制,这样就保证了引用的数据也拷贝了进来。另外还有一种常见的就是将对象中的引用数据递归的浅拷贝,这样得到的对象也是深拷贝,浅显一点就是说:递归浅拷贝=深拷贝
2. 浅拷贝一般就是将原型对象实现cloneable接口,然后重写clone方法,然后返回super.clone(); 这样的到的对象就是浅拷贝。
三、应用
1. Arrays.copyOf()方法虽然返回的是一个新的数组,但是任然保留了原有的引用,所以再修改新的对象的引用数据的时候发现旧的也发生了改变,导致数据错乱。
2. BeanUtils.copyProperties()方法也是,只是做了浅显的拷贝,并没有做真正的拷贝,需要深拷贝的就需要重写该方法。另外对于日期的数据的支持也不是太好!!!😳
四、上代码验证
public class Teacher {
private String name;
private int Salary;
public Teacher(String name,int salary){
this.name = name;
this.Salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setSalary(int salary) {
Salary = salary;
}
public int getSalary() {
return Salary;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", Salary=" + Salary +
'}';
}
public static void main(String[] args){
List<Teacher> list = new ArrayList<>(3);
Teacher asdfa = new Teacher("asdfa", 445);
Teacher aasd = new Teacher("aasd", 55);
Teacher adf = new Teacher("adf", 123);
list.add(aasd);
list.add(asdfa);
list.add(adf);
Teacher[] teachers = Arrays.copyOf(Teachers,Teachers.length);
for(Teacher s : teachers){
System.out.println(s.toString());
}
// 读者注意这里,对teacher做了改动
teachers[1].setName("adfghjkl");
for(Teacher s : teachers){
System.out.println(s.toString());
}
for(Teacher s : teachers){
System.out.println(s.toString());
}
}
}