Copier/cloner un ArrayList dans un autre en Java

Dans ce tutoriel, nous allons voir comment copier tous les éléments d'un ArrayList dans un autre ArrayList. On doit se servir de la méthode clone() de la classe mère Object pour atteindre notre objectif.

Object clone(): cette méthode renvoie une copie de l'instance ArrayList.

Le clonage ne veut pas dire que les deux listes, originale et clonée pointent vers la même case mémoire. Cela est fait juste avec List b = a;. Si vous modifier un élément dans la première liste, il va être modifier également dans la deuxième liste.

Le clonage crée une nouvelle instance qui maintient les mêmes éléments. Cela signifie que vous avez deux différentes listes mais, leurs contenus sont les mêmes. Si vous modifier un élément dans la première liste, il ne va être changer dans la deuxième liste.

Dans cet exemple, on a un ArrayList de type String et on est entrain de la cloner en utilisant la méthode clone(). Le point intéressant ici est de savoir quand on ajoute et on supprime des éléments à la liste originale après le clone.

import java.util.ArrayList;

public class ArrayList_clone {

public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();

//Ajouter des éléments à ArrayList
al.add("Stylo");
al.add("Trousse");
al.add("Crayon");
al.add("Calculatrice");
System.out.println("ArrayList: "+al);

ArrayList<String> al2 = (ArrayList<String>)al.clone();
System.out.println("ArrayList clonée: "+ al2);

//ajouter et supprimer des éléments de la liste originale
al.add("Carnet");
al.remove("Crayon");

//Afficher les deux listes après l'ajout et la suppression
System.out.println("ArrayList Originale: "+al);
System.out.println("ArrayList clonée: "+al2);
}
}
Exécution:

ArrayList: [Stylo, Trousse, Crayon, Calculatrice]
ArrayList clonée: [Stylo, Trousse, Crayon, Calculatrice]
ArrayList Originale: [Stylo, Trousse, Calculatrice, Carnet]
ArrayList clonée: [Stylo, Trousse, Crayon, Calculatrice]
Cependant, vous devez considérer de ne pas utiliser la méthode clone(). Elle marche très bien avec les collections, mais généralement, il vaut mieux utiliser le constructeur new ArrayList(listeOriginale).