Techniques de copie de tableaux en Java : Guide complet
Techniques de copie de tableaux en Java
Apprenez à dupliquer des tableaux unidimensionnels et bidimensionnels en Java en utilisant l'affectation, les boucles, System.arraycopy, Arrays.copyOfRange et plus, avec des exemples clairs et des conseils de bonnes pratiques.
1. Copie avec l'opérateur d'affectation
Affecter une variable de tableau à une autre est la méthode la plus simple. Elle copie la référence, pas les données.
class Main {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5, 6};
int[] positiveNumbers = numbers; // copie de référence
for (int number : positiveNumbers) {
System.out.print(number + ", ");
}
}
}
Sortie :
1, 2, 3, 4, 5, 6
À la fois numbers et positiveNumbers pointent maintenant vers le même objet tableau. Changer un élément affecte l'autre :
class Main {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5, 6};
int[] positiveNumbers = numbers;
numbers[0] = -1;
for (int number : positiveNumbers) {
System.out.print(number + ", ");
}
}
}
Sortie :
-1, 2, 3, 4, 5, 6
C'est une copie superficielle. Pour éviter les effets de bord non intentionnels, utilisez une technique de copie profonde.
2. Copie profonde avec une boucle
Itérer sur chaque élément et l'assigner à un nouveau tableau crée une copie indépendante.
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int[] source = {1, 2, 3, 4, 5, 6};
int[] destination = new int[source.length];
for (int i = 0; i < source.length; ++i) {
destination[i] = source[i];
}
System.out.println(Arrays.toString(destination));
}
}
Sortie :
[1, 2, 3, 4, 5, 6]
Puisque source et destination sont des objets distincts, les modifications de l'un n'affectent pas l'autre.
3. Utilisation de System.arraycopy()
La méthode System.arraycopy de Java offre un moyen rapide et intégré de copier des segments de tableau.
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
src– tableau sourcesrcPos– index de départ dans la sourcedest– tableau destinationdestPos– index de départ dans la destinationlength– nombre d'éléments à copier
Exemple :
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int[] n1 = {2, 3, 12, 4, 12, -2};
int[] n2 = new int[n1.length];
System.arraycopy(n1, 0, n2, 0, n1.length);
System.out.println("n2 = " + Arrays.toString(n2));
int[] n3 = new int[5];
System.arraycopy(n1, 2, n3, 1, 2);
System.out.println("n3 = " + Arrays.toString(n3));
}
}
Sortie :
n2 = [2, 3, 12, 4, 12, -2] n3 = [0, 12, 4, 0, 0]
4. Copie avec Arrays.copyOfRange()
Quand vous avez besoin d'un nouveau tableau contenant une tranche spécifique, Arrays.copyOfRange est idéal.
import java.util.Arrays;
class ArraysCopy {
public static void main(String[] args) {
int[] source = {2, 3, 12, 4, 12, -2};
int[] destination1 = Arrays.copyOfRange(source, 0, source.length);
System.out.println("destination1 = " + Arrays.toString(destination1));
int[] destination2 = Arrays.copyOfRange(source, 2, 5);
System.out.println("destination2 = " + Arrays.toString(destination2));
}
}
Sortie :
destination1 = [2, 3, 12, 4, 12, -2] destination2 = [12, 4, 12]
5. Copie de tableaux 2D avec une boucle
La copie profonde d'un tableau bidimensionnel nécessite de copier chaque ligne individuellement.
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int[][] source = {
{1, 2, 3, 4},
{5, 6},
{0, 2, 42, -4, 5}
};
int[][] destination = new int[source.length][];
for (int i = 0; i < destination.length; ++i) {
destination[i] = new int[source[i].length];
for (int j = 0; j < destination[i].length; ++j) {
destination[i][j] = source[i][j];
}
}
System.out.println(Arrays.deepToString(destination));
}
}
Sortie :
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
6. Copie de tableau 2D avec System.arraycopy()
Remplacez la boucle interne par arraycopy pour un code plus propre.
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int[][] source = {
{1, 2, 3, 4},
{5, 6},
{0, 2, 42, -4, 5}
};
int[][] destination = new int[source.length][];
for (int i = 0; i < source.length; ++i) {
destination[i] = new int[source[i].length];
System.arraycopy(source[i], 0, destination[i], 0, destination[i].length);
}
System.out.println(Arrays.deepToString(destination));
}
}
Sortie :
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
Java
- Maîtriser les tableaux C# : Déclaration, initialisation et opérations
- Maîtriser les opérateurs Java : Types, syntaxe et exemples pratiques
- Commentaires Java : Types, utilisation et bonnes pratiques
- Maîtriser les interfaces Java : concepts, implémentation et bonnes pratiques
- Maîtriser le try-with-resources Java : gestion automatique des ressources expliquée
- Annotations Java expliquées : types, placement et exemples pratiques
- Les tableaux en C++ : Déclaration, initialisation et techniques avec pointeurs
- Maîtriser l'allocation de tableaux dynamiques en C++ : Guide pratique avec exemples de code
- Tutoriel Java Arrays : Déclaration, création et initialisation – Code d'exemple