Deep Copy ein Array in Java

Rupam Yadav 12 Oktober 2023
  1. Deep Copy mit der Funktion System.arraycopy() in Java
  2. Deep Copy ein Array mit dem Befehl Arrays.copyOf in Java
Deep Copy ein Array 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 Yadav avatar Rupam Yadav avatar

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

Verwandter Artikel - Java Array