Deep Copy [] и ArrayList Java - PullRequest
       32

Deep Copy [] и ArrayList Java

2 голосов
/ 20 июля 2010

Я хочу сделать Глубокую копию некоторых объектов [] и ArrayList Как я могу это сделать (без зацикливания и вызова клона)

Стандартных утилит для выполнения не существуетэто?

Спасибо, Жуан

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

Ни один тривиальный объект не должен предоставлять некоторые для поддержки копирования: даже если это в форме реализации Clone или Serialize.Это более или менее почему нет встроенного метода и цикл неизбежен.

Если это весь ваш собственный код, то я бы порекомендовал конструктор копирования поверх клонирования или сериализации / десериализации, поскольку это больше ОО;вы просите объект создать свою собственную копию, а не просите 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 имеют тенденцию очень хорошо оптимизировать базовый код, поэтому, если вы на самом деле не измерите, что у вас есть реальная и измеримая проблема производительности, тогда лучшим будет простой цикл с очень читаемым конструктором копированиядолгосрочный подход.

2 голосов
/ 20 июля 2010

Вы можете сериализовать весь массив и затем десериализовать его в новую переменную. Это эффективно делает глубокую копию.

В противном случае вам придется самостоятельно создавать глубокую копию.

...