我們知道 java 在 new 一個對象的時候,其代價是比 clone 一個對象的代價是要高的,但是拷貝也不能直接用,因 java 的拷貝分為深拷貝和淺拷貝, 雖然深拷貝可以解決淺拷貝的問題,但是也會在深拷貝的時候 new 對象。有一個比較好的額代替方法是:利用序列化實現(xiàn)對對象的拷貝。
在內(nèi)存中通過字節(jié)流的拷貝是比較容易的實現(xiàn)的,把原對象寫入到一個字節(jié)流中,再從字節(jié)流中將其讀取出來,這樣讀取到的對象就是原對象的一個 clone 體,而且不存淺拷貝的問題,是一個真正的深拷貝。
public class CloneUtils {
@SuppressWarnings("unchecked")
public staticT clone(T obj){
T cloneObj = null;
try {
//寫入字節(jié)流
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream obs = new ObjectOutputStream(out);
obs.writeObject(obj);
obs.close();
//分配內(nèi)存,寫入原始對象,生成新對象
ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());
ObjectInputStream ois = new ObjectInputStream(ios);
//返回生成的新對象
cloneObj = (T) ois.readObject();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
return cloneObj;
}
使用該工具類的對象必須要實現(xiàn)Serializable接口,否則是沒有辦法實現(xiàn)克隆的。