Deep Copy di un array in Java

Rupam Yadav 12 ottobre 2023
  1. Deep Copy utilizzando la funzione System.arraycopy() in Java
  2. Copia profonda di un array utilizzando il comando Arrays.copyOf in Java
Deep Copy di un array 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
Autore: Rupam Yadav
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

Articolo correlato - Java Array