make java copy arraylist deep

make - java deep copy



Deep Copy[] y ArrayList Java (2)

Quiero hacer una copia profunda de algún objeto [] y ArrayList ¿Cómo puedo hacer eso (sin hacer bucles y llamar al clon)?

No hay utilidades estándar para hacer esto?

Gracias João


Puede serializar toda la matriz y luego deserializarla en una nueva variable. Esto efectivamente hace una copia profunda.

De lo contrario, tendrías que implementar una copia profunda por ti mismo.


Ninguno de los objetos triviales debe proporcionar algunos para respaldar la copia: incluso si se trata de implementar Clone o Serialize. Esto es más o menos por qué no hay un método incorporado y el ciclo es inevitable.

Si es todo tu propio código, entonces recomendaría un constructor de copia sobre clone o serialize / deserialize ya que es más OO; le pide al objeto que cree su propia copia en lugar de pedirle a la JVM que haga una copia de bajo nivel. Dicho código es muy simple y fácil de leer, por lo que es de esperar que sea más barato de mantener a largo plazo:

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

Todavía necesita un bucle de curso para recorrer la colección anterior invocando el constructor de copia para rellenar la nueva colección. Hay un libro llamado Effective Java que entra en muchos detalles sobre las trampas de la clonación y la serialización que recomiendo encarecidamente.

Hay algunos sistemas que realmente necesitan una copia y clasificación de alta velocidad y similares (por ejemplo, Hadoop). Dichos sistemas ponen la responsabilidad del desarrollador para que admita un formato binario personalizado (por ejemplo, byte [] getAsBytes () / Widget público (byte [] fromBytes)). El empaquetamiento de muchos objetos convertidos en byte [] en una matriz más grande significa que se pueden copiar todos a la vez muy rápidamente utilizando System.arraycopy en la matriz grande. La JVM va a hacer System.arraycopy como una copia de memoria de bajo nivel. Todavía necesitará el ciclo para deserializar los objetos del fragmento de bytes después de la copia.

En general, el compilador y jvm tienden a optimizar muy bien el código básico, de modo que a menos que realmente mida que tiene un problema de rendimiento real y mensurable, un bucle muy simple con un constructor de copia muy legible será el mejor enfoque a largo plazo.