Copier en profondeur un tableau en Java
-
Deep Copy à l’aide de la fonction
System.arraycopy()
en Java -
Copiez en profondeur un tableau à l’aide de la commande
Arrays.copyOf
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
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