2010-07-20 122 views
2

我想做出一些在Object []一個深複製和ArrayList 我如何能做到這一點(不循環,並呼籲克隆)深複製[]和ArrayList的Java

有沒有標準utils的爲了做到這一點?

感謝 若昂

+0

深層副本將會有某種概念循環。問題是它是否隱藏在util內部的視圖中。 – corsiKa 2010-07-20 15:52:15

+0

Dupe? http://stackoverflow.com/questions/64036/how-do-you-make-a-deep-copy-of-an-object-in-java – 2010-07-20 15:56:26

+0

你打算修改副本嗎? – Arkadiy 2010-07-20 15:58:15

回答

2

無小事對象需要提供一些支持複製:即使是在實施克隆或序列化的形式。這或多或少是爲什麼沒有內置方法,並且循環是不可避免的。

如果它是所有自己的代碼,然後我會建議一個拷貝構造函數在任何克隆或序列化/反序列化,因爲這是更面向對象;您要求對象創建自己的副本,而不是讓JVM執行低級副本。這樣的代碼是非常簡單和容易,所以希望更便宜,從長遠來看,保持閱讀:

public class Widget { 
    private int x = 0; 
    public Widget(Widget copyMe){ 
     this.x = copyMe.x; 
     // ... 
    } 
    // .... 
} 

你仍然需要當然要遍歷所有的收舊調用拷貝構造函數來填充新的收集循環。有一本名爲Effective Java的書,詳細介紹了我強烈推薦的克隆和序列化的陷阱。

有一些系統,其真正需要的非常高的速度複製和分選和等(例如Hadoop的)。這樣的系統把責任推給開發者以支持自定義的二進制格式(例如byte [] getAsBytes()/ public Widget(byte [] fromBytes))。將大量轉換爲byte []的對象打包成一個更大的數組意味着它們可以使用大數組上的System.arraycopy快速複製。 JVM將把System.arraycopy作爲低級內存拷貝。在複製之後,您仍然需要循環來反序列化字節塊中的對象。

一般來說,編譯器和jvm傾向於非常好地優化基本代碼,所以除非你真的測量出你有一個真正的可測量的性能問題,那麼一個非常簡單的循環和一個非常可讀的拷貝構造函數將是最好的長期做法。

2

可以序列整個數組,然後將其反序列化到一個新的變量。這有效地進行了深層複製。

否則,您將不得不自己實施深層複製。

+0

但我認爲這比通過元素循環更糟糕嗎? 問候 – 2010-07-20 15:54:27

+0

只有在ArrayList的內容是序列化的序列化 – naikus 2010-07-20 16:02:02

+0

會比手動循環慢,但要簡單得多,特別是如果你有一個複雜的對象層次。 – codymanix 2010-07-20 16:52:55