淺拷貝
list A淺拷貝給list B,由於進行的是淺拷貝,所以直接將A的內容複製給了B,java中相同內容的數組指向同一地址,即進行淺拷貝後A與B指向同一地址。造成的後果就是,改變B的同時也會改變A,因爲改變B就是改變B所指向地址的內容,由於A也指向同一地址,所以A與B一起改變。
深拷貝
深拷貝就是將A複製給B的同時,給B創建新的地址,再將地址A的內容傳遞到地址B。ListA與ListB內容一致,但是由於所指向的地址不同,所以改變相互不受影響。
package com.xiaobu.note.List;
import lombok.Data;
import java.io.Serializable;
/**
* @author xiaobu
* @version JDK1.8.0_171
* @date on 2020/4/22 15:51
* @description
*/
@Data
public class Person implements Serializable {
private static final long serialVersionUID = 4985979692978416419L;
private String name;
private Integer age;
public Person(){
}
public Person(String name,Integer age){
this.name = name;
this.age = age;
}
}
package com.xiaobu.note.List;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author xiaobu
* @version JDK1.8.0_171
* @date on 2018/11/9 17:31
* @description V1.0
*/
public class Demo6 {
public static void main(String[] args) {
List list1 = new ArrayList<>();
Person person1 = new Person("1", 1);
Person person2 = new Person("2", 2);
list1.add(person1);
list1.add(person2);
List list2 = new ArrayList<>();
List list3;
list2.addAll(list1);
list3 = deepCopy(list1);
System.out.println("修改前==========");
System.out.println("list2 = " + list2);
System.out.println("list1 = " + list1);
System.out.println("list3 = " + list3);
person2.setAge(3);
System.out.println("修改後==========");
System.out.println("list2 = " + list2);
System.out.println("list1 = " + list1);
System.out.println("list3 = " + list3);
}
/**
* 功能描述:深拷貝
* @author xiaobu
* @date 2020/4/22 17:17
* @param src list
* @return java.util.List<T>
* @version 1.0
*/
public static <T> List<T> deepCopy(List<T> src) {
try {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(src);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
@SuppressWarnings("unchecked")
List<T> dest = (List<T>) in.readObject();
return dest;
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
結果如圖:
list3執行的深拷貝所以不受影響,list2執行的淺拷貝,list1和list2內存地址一致,只要有一個裏面的對象屬性發生變化就會隨着改變。