Java中,創建一個對象,我們通常會有一個引用(可以理解爲變量)指向該對象,當我們通過引用變量改變對象的值(屬性)時,引用是不變的,變的是內存裏面的那塊內存,即引用所指向的對象。引用意味着,任何人對引用所指向的對象屬性或方法做改變時,都將會體現出來。有時候我們需要真正的複製(拷貝內存地址所有資料存放到另外一個地址,也就是同時擁有兩份一模一樣的東西在兩個地方存在),而不僅僅是複製了改引用給另外一個變量。下面代碼是實現深度複製的一種方式:
import java.io.*;
/**
* Create by tiger on 2019/2/26
*/
public class DeepCopy {
/**
* 深度複製,實參類必須實現Serializable接口
*
* @param object
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public static Object deepCopy(Object object) throws IOException, ClassNotFoundException {
//字節數組輸出流,對象序列化後保存的對象
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//對象輸出流
ObjectOutputStream oos = new ObjectOutputStream(bos);
//將對象序列化輸出到字節輸出流中
oos.writeObject(object);
//然後反序列化,從字節輸出流裏中讀取出來,即完成複製
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
//對象輸入流
ObjectInputStream ois = new ObjectInputStream(bis);
//讀取字節流,反序列化爲對象
return ois.readObject();
}
}