Chiama clone () su un array anche clonare i suoi contenuti?

Se invoco il metodo clone() sulla matrice di oggetti di tipo A, come clonerà i suoi elementi? La copia farà riferimento agli stessi oggetti? O chiamerà (element of type A).clone() per ognuno di essi?

clone() crea una copia superficiale. Il che significa che gli elementi non saranno clonati. (Cosa succede se non hanno implementato Cloneable ?)

Potresti voler usare Arrays.copyOf(..) per copiare gli array invece di clone() (anche se la clonazione va bene per gli array, a differenza di qualsiasi altra cosa)

Se vuoi una clonazione profonda, controlla questa risposta


Un piccolo esempio per illustrare la superficialità di clone() anche se gli elementi sono 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("-----"); } 

stampe:

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

Se invoco il metodo clone () sulla matrice di oggetti di tipo A, come clonerà i suoi elementi?

Gli elementi dell’array non saranno clonati.

La copia farà riferimento agli stessi oggetti?

Sì.

O chiamerà (elemento di tipo A) .clone () per ognuno di essi?

No, non chiamerà clone() su nessuno degli elementi.

L’array 1D di primitive copia gli elementi quando è clonato. Questo ci spinge a clonare array 2D (Array of Arrays).

Ricorda che il clone di array 2D non funziona a causa dell’implementazione di copia poco profonda di 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 } 

Il clone è una copia superficiale dell’array.

Questo codice di prova stampa:

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

poiché il MutableInteger è condiviso in entrambi gli array come objects[0] e objects2[0] , ma è ansible modificare gli objects[1] riferimento objects[1] indipendentemente dagli 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)); } }