Deep Copy ein Array in Java
-
Deep Copy mit der Funktion
System.arraycopy()
in Java -
Deep Copy ein Array mit dem Befehl
Arrays.copyOf
in Java
In diesem Tutorial besprechen wir, wie Sie ein Array in Java tief kopieren.
Im Allgemeinen gibt es in Java zwei Arten von Array-Kopiermethoden: die Shallow Copy und die Deep Copy. Beim Flachkopieren werden die Objekte kopiert. Andererseits werden alle Elemente kopiert, während in Deep Copy ein anderes Array erstellt wird.
Unten ist ein Beispiel, das zeigt, was passiert, wenn wir ein Array direkt in ein anderes kopieren. Wir erstellen ein Array arr1
mit Items und initialisieren dann ein weiteres arr2
mit arr1
. Wenn ein Element von arr2
geändert wird, wird die Änderung auch auf arr1
reflektiert.
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));
}
}
Ausgabe:
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 mit der Funktion System.arraycopy()
in Java
Im folgenden Beispiel nehmen wir ein Array arr1
mit wenigen Elementen und nehmen dann ein weiteres Array arr2
und geben ihm die Größe von arr1
. Wir rufen die Methode arrayCopy()
der Klasse System
auf, die ein Array in ein anderes kopiert.
Die Funktion arrayCopy()
benötigt vier Argumente; die ersten beiden sind das Quell-Array und die Startposition der Kopie im Quell-Array. Das dritte Argument ist das Zielarray und seine Startposition, in die wir Elemente kopieren, und die Anzahl der Elemente, die in ein neues Array kopiert werden sollen.
Wenn wir das Element arr2
ändern, ändern sich die Elemente von arr1
wie im vorherigen Beispiel überhaupt nicht.
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));
}
}
Ausgabe:
arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [10, 20, 30]
Deep Copy ein Array mit dem Befehl Arrays.copyOf
in Java
Im Folgenden verwenden wir die Methode copyOf()
der Dienstprogrammklasse Arrays
. Es akzeptiert das zu kopierende Array und seine Größe gibt dann das Array desselben Typs zurück. Wir erstellen mit dieser Methode ein neues Array arr2
und prüfen, ob das Ändern von arr2
arr1
ändert oder nicht. Die Ausgabe zeigt das Ergebnis.
Beachten Sie, dass diese und die vorherige Methode eine flache Kopie anstelle einer tiefen Kopie erstellen, wenn das Array Objekte anstelle von Primitiven enthält.
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));
}
}
Ausgabe:
arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [30, 20, 30]
Wir können auch Arrays.copyOf()
verwenden, um zweidimensionale Arrays zu kopieren. Im Beispiel unten haben wir ein 2D-Array arr
. Wir haben ein neues Array arr2
, und in der Schleife verwenden wir Arrays.copyOf
, das jedes Element von arr
nimmt und es Element für Element in arr2
kopiert. Nach dem Kopieren prüfen wir, ob sich arr1
ändert, wenn arr2
geändert wird. Wenn es sich nicht ändert, handelt es sich um ein tief kopiertes Array.
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]);
}
}
Ausgabe:
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