Deep Copy di un array in Java
-
Deep Copy utilizzando la funzione
System.arraycopy()
in Java -
Copia profonda di un array utilizzando il comando
Arrays.copyOf
in Java
In questo tutorial, discutiamo come copiare in profondità un array in Java.
In genere, esistono due tipi di metodi di copia array in Java: Shallow Copy e Deep Copy. In Shallow copy, gli oggetti vengono copiati. D’altra parte, tutti gli elementi vengono copiati mentre viene creato un array diverso in Deep Copy.
Di seguito è riportato un esempio che mostra cosa succede quando si copia un array direttamente in un altro. Creiamo un array arr1
con elementi e poi inizializziamo un altro arr2
con arr1
. Quando un elemento di arr2
viene modificato, la modifica si riflette anche su arr1
.
import java.util.Arrays;
public class DeepCopy {
public static void main(String[] args) {
int[] arr1 = {10, 20, 30};
System.out.println("arr1 Before copying: " + Arrays.toString(arr1));
int[] arr2 = arr1;
System.out.println("arr2 After copying: " + Arrays.toString(arr1));
arr2[0] = 30;
System.out.println(
"arr1 after copying and changing an element in arr2: " + Arrays.toString(arr1));
}
}
Produzione:
arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [30, 20, 30]
Deep Copy utilizzando la funzione System.arraycopy()
in Java
Nell’esempio seguente, prendiamo un array arr1
con pochi elementi e poi prendiamo un altro array arr2
e gli diamo la dimensione uguale a quella di arr1
. Chiamiamo il metodo arrayCopy()
della classe System
che copia un array in un altro.
La funzione arrayCopy()
accetta quattro argomenti; i primi due sono l’array di origine e la posizione iniziale della copia nell’array di origine. Il terzo argomento è l’array di destinazione e la sua posizione iniziale, dove verranno copiati gli elementi, e il numero di elementi da copiare in un nuovo array.
Quando cambiamo l’elemento arr2
, proprio come nell’esempio precedente, gli elementi di arr1
non cambiano affatto.
import java.util.Arrays;
public class DeepCopy {
public static void main(String[] args) {
int[] arr1 = {10, 20, 30};
System.out.println("arr1 Before copying: " + Arrays.toString(arr1));
int[] arr2 = new int[arr1.length];
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
System.out.println("arr2 After copying: " + Arrays.toString(arr1));
arr2[0] = 30;
System.out.println(
"arr1 after copying and changing an element in arr2: " + Arrays.toString(arr1));
}
}
Produzione:
arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [10, 20, 30]
Copia profonda di un array utilizzando il comando Arrays.copyOf
in Java
Di seguito, utilizziamo il metodo copyOf()
della classe di utilità Arrays
. Accetta l’array da copiare e la sua dimensione, quindi restituisce l’array dello stesso tipo. Creiamo un nuovo array arr2
usando questo metodo e controlliamo se cambiando arr2
cambia arr1
o meno. L’output mostra il risultato.
Nota che questo metodo e il precedente creano una copia superficiale invece di una copia profonda quando l’array contiene oggetti invece di primitive.
import java.util.Arrays;
public class DeepCopy {
public static void main(String[] args) {
int[] arr1 = {10, 20, 30};
System.out.println("arr1 Before copying: " + Arrays.toString(arr1));
int[] arr2 = Arrays.copyOf(arr1, arr1.length);
System.out.println("arr2 After copying: " + Arrays.toString(arr1));
arr2[0] = 30;
System.out.println(
"arr1 after copying and changing an element in arr2: " + Arrays.toString(arr1));
}
}
Produzione:
arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [30, 20, 30]
Possiamo anche usare Arrays.copyOf()
per copiare array bidimensionali. Nell’esempio seguente, abbiamo un array 2D arr
. Abbiamo un nuovo array arr2
e nel bucle usiamo Arrays.copyOf
che prende ogni elemento di arr
e lo copia nell’elemento arr2
elemento per elemento. Una volta copiato, controlliamo se arr1
cambia se arr2
è cambiato. Se non cambia, è un array copiato in profondità.
import java.util.Arrays;
public class DeepCopy {
public static void main(String[] args) {
int[][] arr = {{1, 2}, {3, 4}, {5, 6}};
System.out.println("Values of arr");
for (int i = 0; i < arr.length; i++)
for (int j = 0; j < arr.length - 1; j++)
System.out.println("arr[" + i + "][" + j + "] = " + arr[i][j]);
System.out.println();
int[][] arr2 = new int[arr.length][];
for (int i = 0; i < arr.length; i++) {
arr2[i] = Arrays.copyOf(arr[i], arr[i].length);
}
System.out.println("Values of arr2");
for (int i = 0; i < arr2.length; i++)
for (int j = 0; j < arr2.length - 1; j++)
System.out.println("arr2[" + i + "][" + j + "] = " + arr2[i][j]);
arr2[0][1] = 5;
System.out.println();
System.out.println("Values of arr after changing an element in arr2");
for (int i = 0; i < arr.length; i++)
for (int j = 0; j < arr.length - 1; j++)
System.out.println("arr[" + i + "][" + j + "] = " + arr[i][j]);
}
}
Produzione:
Values of arr
arr[0][0] = 1
arr[0][1] = 2
arr[1][0] = 3
arr[1][1] = 4
arr[2][0] = 5
arr[2][1] = 6
Values of arr2
arr2[0][0] = 1
arr2[0][1] = 2
arr2[1][0] = 3
arr2[1][1] = 4
arr2[2][0] = 5
arr2[2][1] = 6
Values of arr after changing an element in arr2
arr[0][0] = 1
arr[0][1] = 2
arr[1][0] = 3
arr[1][1] = 4
arr[2][0] = 5
arr[2][1] = 6
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn