web-dev-qa-db-fra.com

Java Copie ArrayList

J'ai un ArrayListl1 de taille 10. J'attribue l1 au nouveau type de référence de liste l2. Est-ce que l1 et l2 désigneront le même objet ArrayList? Ou une copie de l'objet ArrayList est-elle affectée à l2?

Lors de l'utilisation de la référence l2, si je mets à jour l'objet liste, il reflète également les modifications apportées au type de référence l1.

Par exemple:

List<Integer> l1 = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
    l1.add(i);
}

List l2 = l1;
l2.clear();

N'y a-t-il pas d'autre moyen d'affecter une copie d'un objet de liste à une nouvelle variable de référence, mis à part la création de 2 objets de liste et la copie sur des collections d'ancien à nouveau?

193
user309281

Oui, l'affectation copiera simplement le valeur de l1 (qui est une référence) dans l2. Ils feront tous deux référence au même objet.

Créer une copie superficielle est assez facile cependant:

List<Integer> newList = new ArrayList<>(oldList);

(Juste à titre d'exemple.)

410
Jon Skeet
66
Sergii Zagriichuk

Oui l1 et l2 pointeront vers la même référence, le même objet.

Si vous voulez créer une nouvelle ArrayList basée sur l'autre ArrayList, procédez comme suit:

List<String> l1 = new ArrayList<String>();
l1.add("Hello");
l1.add("World");
List<String> l2 = new ArrayList<String>(l1); //A new arrayList.
l2.add("Everybody");

Le résultat sera l1 aura toujours 2 éléments et l2 aura 3 éléments.

31
Alfredo Osorio

Voici un autre moyen pratique de copier les valeurs de src ArrayList vers arraylist:

ArrayList<String> src = new ArrayList<String>();
src.add("test string1");
src.add("test string2");
ArrayList<String> dest= new ArrayList<String>();
dest.addAll(src);

Ceci est une copie réelle des valeurs et pas seulement une copie de la référence.

19
Harshal Waghmare

Il existe une méthode addAll () qui servira à copier One ArrayList dans un autre.

Par exemple, vous avez deux listes de tableaux: sourceList et targetList , utilisez ci-dessous code.

targetList.addAll (sourceList);

7
vaibhav agrawal

Java ne transmet pas d’objets, il transmet des références (pointeurs) aux objets. Donc oui, l2 et l1 sont deux pointeurs sur le même objet.

Vous devez faire une copie explicite si vous avez besoin de deux listes différentes avec le même contenu.

3
JB Nizet