java 之 利用序列化實現(xiàn)深拷貝

我們知道 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)克隆的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,662評論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,001評論 25 709
  • 不能繼續(xù)喜歡你,想想就覺得很可惜
    月琳兒閱讀 210評論 0 0
  • 原本的我可以為愛奮不顧身,五年后的我,變得唯唯諾諾,猶豫不決。 我高一時,愛慕過一個男...
    鹿鹿大小姐閱讀 667評論 2 2
  • 昨天做了個好長好長的夢,關(guān)于純兒,關(guān)于小雨。為了純兒而欺騙小雨的夢,不想讓純兒吃一點醋的夢,還有人死,小雨被當(dāng)做嫌...
    棲惶閱讀 304評論 0 0

友情鏈接更多精彩內(nèi)容