¿Llamar clone () a una matriz también clona sus contenidos?

Si invoco el método clone() en una matriz de objetos de tipo A, ¿cómo clonará sus elementos? ¿La copia estará haciendo referencia a los mismos objetos? ¿O llamará (element of type A).clone() para cada uno de ellos?

clone() crea una copia superficial. Lo que significa que los elementos no serán clonados. (¿Qué pasa si no implementaron Cloneable ?)

Es posible que desee utilizar Arrays.copyOf(..) para copiar matrices en lugar de clone() (aunque la clonación está bien para las matrices, a diferencia de cualquier otra cosa)

Si quieres clonación profunda, mira esta respuesta


Un pequeño ejemplo para ilustrar la superficialidad de clone() incluso si los elementos son Cloneable :

 ArrayList[] array = new ArrayList[] {new ArrayList(), new ArrayList()}; ArrayList[] clone = array.clone(); for (int i = 0; i < clone.length; i ++) { System.out.println(System.identityHashCode(array[i])); System.out.println(System.identityHashCode(clone[i])); System.out.println(System.identityHashCode(array[i].clone())); System.out.println("-----"); } 

Huellas dactilares:

 4384790 4384790 9634993 ----- 1641745 1641745 11077203 ----- 

Si invoco el método clone () en una matriz de objetos de tipo A, ¿cómo clonará sus elementos?

Los elementos de la matriz no serán clonados.

¿La copia estará haciendo referencia a los mismos objetos?

Sí.

¿O llamará (elemento del tipo A) .clone () para cada uno de ellos?

No, no invocará clone() en ninguno de los elementos.

La matriz 1D de primitivas copia elementos cuando se clona. Esto nos tienta a clonar una matriz 2D (matriz de matrices).

Recuerde que el clon de matriz 2D no funciona debido a la implementación de copia poco profunda de clone() .

 public static void main(String[] args) { int row1[] = {0,1,2,3}; int row2[] = row1.clone(); row2[0] = 10; System.out.println(row1[0] == row2[0]); // prints false int table1[][]={{0,1,2,3},{11,12,13,14}}; int table2[][] = table1.clone(); table2[0][0] = 100; System.out.println(table1[0][0] == table2[0][0]); //prints true } 

El clon es una copia superficial de la matriz.

Este código de prueba se imprime:

 [1, 2] / [1, 2]
 [100, 200] / [100, 2]

porque el MutableInteger se comparte en ambas matrices como objects[0] y objects2[0] , pero puede cambiar los objects[1] referencia objects[1] independientemente de los objects2[1] .

 import java.util.Arrays; public class CloneTest { static class MutableInteger { int value; MutableInteger(int value) { this.value = value; } @Override public String toString() { return Integer.toString(value); } } public static void main(String[] args) { MutableInteger[] objects = new MutableInteger[] { new MutableInteger(1), new MutableInteger(2) }; MutableInteger[] objects2 = objects.clone(); System.out.println(Arrays.toString(objects) + " / " + Arrays.toString(objects2)); objects[0].value = 100; objects[1] = new MutableInteger(200); System.out.println(Arrays.toString(objects) + " / " + Arrays.toString(objects2)); } }