一、區別
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());
}
}
}