Copier en profondeur un tableau en Java

Rupam Yadav 12 octobre 2023
  1. Deep Copy à l’aide de la fonction System.arraycopy() en Java
  2. Copiez en profondeur un tableau à l’aide de la commande Arrays.copyOf en Java
Copier en profondeur un tableau en Java

Dans ce didacticiel, nous expliquons comment copier en profondeur un tableau en Java.

Généralement, il existe deux types de méthodes de copie de tableaux en Java : la copie superficielle et la copie profonde. En copie superficielle, les objets sont copiés. D’un autre côté, tous les éléments sont copiés tandis qu’un tableau différent est créé dans Deep Copy.

Vous trouverez ci-dessous un exemple qui montre ce qui se passe lorsque nous copions directement un tableau dans un autre. On crée un tableau arr1 avec des items puis on initialise un autre arr2 avec arr1. Lorsqu’un élément de arr2 est modifié, le changement se reflète également dans 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));
  }
}

Production:

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 à l’aide de la fonction System.arraycopy() en Java

Dans l’exemple suivant, nous prenons un tableau arr1 avec quelques éléments puis prenons un autre tableau arr2 et lui donnons la taille égale à celle de arr1. On appelle la méthode arrayCopy() de la classe System qui copie un tableau dans un autre.

La fonction arrayCopy() prend quatre arguments ; les deux premiers sont le tableau source et la position de départ de la copie dans le tableau source. Le troisième argument est le tableau de destination et sa position de départ, où nous allons copier les éléments, et le nombre d’éléments à copier dans un nouveau tableau.

Lorsque nous modifions l’élément arr2, comme dans l’exemple précédent, les éléments de arr1 ne changent pas du tout.

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));
  }
}

Production:

arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [10, 20, 30]

Copiez en profondeur un tableau à l’aide de la commande Arrays.copyOf en Java

Ci-dessous, nous utilisons la méthode copyOf() de la classe utilitaire Arrays. Il accepte le tableau à copier et sa taille renvoie alors le tableau du même type. Nous créons un nouveau tableau arr2 en utilisant cette méthode et vérifions si changer arr2 change arr1 ou non. La sortie montre le résultat.

Notez que cette méthode et la précédente créent une copie superficielle au lieu d’une copie profonde lorsque le tableau contient des objets au lieu de primitives.

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));
  }
}

Production:

arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [30, 20, 30]

Nous pouvons également utiliser Arrays.copyOf() pour copier un tableau à deux dimensions. Dans l’exemple ci-dessous, nous avons un tableau 2D arr. Nous avons un nouveau tableau arr2, et dans la boucle, nous utilisons Arrays.copyOf() qui prend chaque élément de arr et le copie dans le arr2 élément par élément. Une fois copié, on vérifie si arr1 change si arr2 est changé. Si cela ne change pas, c’est un tableau copié en profondeur.

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]);
  }
}

Production:

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
Auteur: 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

Article connexe - Java Array