Arrays.copyOf()
copyOf() est une méthode utilitaire de la classe java.util.Arrays qui permet de copier un tableau (ou une partie d’un tableau) dans un nouveau tableau.
copyOf()
java.util.Arrays
Elle est particulièrement utile pour :
Syntaxe : type[] nouveauTableau = Arrays.copyOf(tableauOriginal, nouvelleLongueur);
type[] nouveauTableau = Arrays.copyOf(tableauOriginal, nouvelleLongueur);
nouvelleLongueur : longueur du nouveau tableau.
Si on souhaite créer une copie exacte d’un tableau (avec la même taille), on utilise la longueur originale du tableau.
Exemple :
int[] original = {10, 20, 30, 40, 50}; int[] copie = Arrays.copyOf(original, original.length); // copie = [10, 20, 30, 40, 50]
Si on veut agrandir ou réduire un tableau, il faut spécifier une nouvelle longueur.
Exemple 1 : Agrandir un tableau
int[] original = {10, 20, 30}; int[] agrandi = Arrays.copyOf(original, 5); // agrandi = [10, 20, 30, 0, 0] (les nouveaux éléments sont initialisés à 0)
Exemple 2 : Réduire un tableau
int[] original = {10, 20, 30, 40, 50}; int[] reduit = Arrays.copyOf(original, 3); // reduit = [10, 20, 30] (les éléments au-delà de l'index 2 sont ignorés)
Si on veut copier un sous-ensemble d’un tableau, il faut utiliser Arrays.copyOfRange() (variante de copyOf).
Arrays.copyOfRange()
int[] original = {10, 20, 30, 40, 50}; int[] sousTableau = Arrays.copyOfRange(original, 1, 4); // le sousTableau = [20, 30, 40] (copie des éléments de l'index 1 à 3)
En Java, les tableaux sont des objets mutables. Si on assigne un tableau à une nouvelle variable, les 2 variables pointentt le même objet en mémoire. Toute modification de l’un affecte l’autre ! Nous en avons parlé cette semaine sur le passage par valeur et par référence.
Si on assigne un tableau à une nouvelle variable, les 2 variables pointentt le même objet en mémoire
int[] original = {10, 20, 30}; int[] copie = original; // copie et original pointent vers le même tableau ! copie[0] = 100; System.out.println(original[0]); // il affichera la valeur 100 (modifié involontairement) Solution avec copyOf : ```java int[] original = {10, 20, 30}; int[] copie = Arrays.copyOf(original, original.length); // copie indépendante copie[0] = 100; System.out.println(original[0]); // affiche 10 (original non modifié)
Les tableaux ont une taille fixe. Mais grâce à Arrays.copyOf(), vous allez pouvoir créer un nouveau tableau avec une taille différente.
int[] tableau = {1, 2, 3}; tableau = Arrays.copyOf(tableau, tableau.length + 1); // agrandit le tableau de 1 élément tableau[3] = 4; // tableau = [1, 2, 3, 4]
Utile pour travailler sur un sous-ensemble de données sans modifier le tableau original. Déjà vu plus haut dans cette page.
int[] notes = {12, 15, 9, 14, 18, 7}; int[] meilleuresNotes = Arrays.copyOfRange(notes, 2, 5); // meilleuresNotes = [9, 14, 18] (notes de l'index 2 à 4)
System.arraycopy()
En java, il y a plusieurs moyens de manipuler des tableaux, voici un exemple avec des méthodes différentes.
int[] copie = Arrays.copyOf(original, nouvelleLongueur);
System.arraycopy(original, 0, destination, 0, longueur);
int[] original = {10, 20, 30, 40}; int[] destination = new int[4]; System.arraycopy(original, 0, destination, 0, original.length); // destination = [10, 20, 30, 40]
import java.util.Arrays; public class ExempleCopyOf { public static void main(String[] args) { // original int[] original = {10, 20, 30, 40, 50}; System.out.println("tb original : " + Arrays.toString(original)); // copie complète int[] copieComplete = Arrays.copyOf(original, original.length); System.out.println("tb avec copie complète : " + Arrays.toString(copieComplete)); // copie tronquée int[] copieTronquee = Arrays.copyOf(original, 3); System.out.println("tb avec copie tronquée : " + Arrays.toString(copieTronquee)); // la copie agrandie int[] copieAgrandie = Arrays.copyOf(original, 7); System.out.println("tp avec copie agrandie : " + Arrays.toString(copieAgrandie)); // avec modif de la copie (sans affecter original) copieComplete[0] = 100; System.out.println("tb original après modification de la copie : " + Arrays.toString(original)); } }
Sortie :
tb original : [10, 20, 30, 40, 50] tb avec copie complète : [10, 20, 30, 40, 50] tb avec copie tronquée : [10, 20, 30] tp avec copie agrandie : [10, 20, 30, 40, 50, 0, 0] tb original après modification de la copie : [10, 20, 30, 40, 50]