簡體   English   中英

Deep Copy []和ArrayList Java

[英]Deep Copy [] and ArrayList Java

我想對某些Object []和ArrayList進行深層復制 ,我該怎么做(沒有循環,也沒有調用clone)

沒有標准的工具來做到這一點?

感謝João

您可以序列化整個數組,然后將其反序列化為新變量。 這有效地進行了深層復制。

否則,您將必須自己實施一個深層副本。

瑣碎的對象都不需要提供某些東西來支持復制:即使是以實現克隆或序列化的形式。 這或多或少是為什么沒有內置方法並且循環不可避免的原因。

如果所有代碼都是您自己的,那么我建議您在克隆或序列化/反序列化上推薦一個復制構造函數,因為這樣做比較OO。 您要求對象創建自己的副本,而不是讓JVM執行低級副本。 這樣的代碼非常簡單易讀,因此從長遠來看希望維護起來便宜:

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

當然,您仍然需要循環來遍歷舊集合,並調用復制構造函數來填充新集合。 有一本名為《有效的Java》的書,詳細介紹了我強烈建議的克隆和序列化的陷阱。

有些系統確實需要非常高速的復制和排序等(例如Hadoop)。 這樣的系統使開發人員有責任支持自定義二進制格式(例如,byte [] getAsBytes()/ public Widget(byte [] fromBytes))。 將許多變成byte []的對象打包到一個更大的數組中,意味着可以使用大數組上的System.arraycopy快速地一次復制所有對象。 JVM將System.arraycopy做為低級內存副本。 您仍然需要循環以從復制后的字節塊中反序列化對象。

通常,編譯器和jvm往往會很好地優化基本代碼,因此,除非您實際測量出存在真實且可衡量的性能問題,否則使用可讀性強的復制構造函數進行非常簡單的循環將是最佳的長期方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM