90 votes

Comment copier le contenu d'une ArrayList dans une autre ?

J'ai quelques structures de données, et je voudrais en utiliser une comme temporaire, et une autre comme non temporaire.

ArrayList<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();

//fill myTempObject here
....

//make myObject contain the same values as myTempObject
myObject = myTempObject;

//free up memory by clearing myTempObject
myTempObject.clear();

Le problème avec ça, bien sûr, c'est que myObject ne fait que pointer vers myTempObject et ainsi de suite myTempObject est effacée, tout comme myObject .

Comment puis-je conserver les valeurs de myTempObject en myObject en utilisant java ?

0 votes

Vous pouvez utiliser List.addAll . Mais si vous devez conserver tous les objets, l'effacement de la liste temporaire ne va pas vraiment libérer beaucoup de mémoire. Parce que vous essayez seulement d'effacer les références, alors que vous essayez de conserver les objets.

0 votes

Pour autant que je sache, cette réponse est toujours valable : stackoverflow.com/questions/715650/

2 votes

Il est difficile d'interpréter ce que vous essayez vraiment d'obtenir. Vous devez expliquer votre situation.

149voto

Artem Points 2001

Vous pouvez utiliser cette astuce :

myObject = new ArrayList<Object>(myTempObject);

ou utiliser

myObject = (ArrayList<Object>)myTempObject.clone();

Vous pouvez obtenir quelques informations sur la méthode clone() aquí

Mais n'oubliez pas que toutes ces méthodes vous donneront une copie de votre Liste mais pas tous ses éléments. Ainsi, si vous modifiez l'un des éléments de votre liste copiée, il sera également modifié dans votre liste originale.

44voto

Dhananjay Points 21

Liste originale de tableaux. addAll (copyArrayList) ;

Veuillez noter : Lorsque vous utilisez la méthode addAll() pour copier, le contenu des deux listes de tableaux (originalArrayList et copyArrayList) fait référence aux mêmes objets ou contenus. Ainsi, si vous modifiez l'un d'entre eux, l'autre reflétera également le même changement.

Si vous ne voulez pas que cela se produise, vous devez copier chaque élément de l'originalArrayList vers le copyArrayList, en utilisant par exemple une boucle for ou while.

1 votes

Comment arrêter l'affectation à une autre liste ? Y a-t-il un autre moyen de gérer cela ?

0 votes

@Mahesh - référez-vous à ceci stackoverflow.com/questions/715650/

17voto

Brian Roach Points 43787

Il n'y a pas de copies implicites effectuées en java via l'opérateur d'affectation. Les variables contiennent une valeur de référence (pointeur) et lorsque vous utilisez la fonction = vous ne copiez que cette valeur.

Afin de préserver le contenu de myTempObject vous devez en faire une copie.

Cela peut être fait en créant une nouvelle ArrayList en utilisant le constructeur qui prend un autre ArrayList :

ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);

Edit : Comme le souligne Bohemian dans les commentaires ci-dessous, est-ce bien ce que vous demandez ? En faisant ce qui précède, les deux ArrayList s ( myTempObject y myObject ) contiendrait des références à la même objets. Si vous souhaitez réellement obtenir une nouvelle liste contenant de nouvelles copies des objets contenus dans la liste myTempObject alors vous devrez faire une copie de chaque objet individuel dans l'original. ArrayList

8voto

PaulC Points 81

Je suis tombé sur ce document alors que j'étais moi-même confronté au même problème.

En disant arraylist1 = arraylist2, les deux listes pointent au même endroit, donc si vous modifiez l'une ou l'autre, les données changent et les deux listes restent toujours les mêmes.

Pour copier des valeurs dans une liste indépendante, j'ai simplement utilisé foreach pour copier le contenu :

ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();

remplissez la liste1 de la manière dont vous êtes actuellement.

foreach(<type> obj in list1)
{
    list2.Add(obj);
}

6voto

Java Main Points 1255

Supposons que vous vouliez copier oldList dans un nouvel objet ArrayList appelé newList.

ArrayList<Object> newList = new ArrayList<>() ;

for (int i = 0 ; i<oldList.size();i++){
    newList.add(oldList.get(i)) ;
}

Ces deux listes sont indépendantes, les modifications apportées à l'une ne sont pas répercutées sur l'autre.

0 votes

OldList et newList seraient toujours dépendantes. Si vous supprimiez un élément de la newList, il serait également supprimé de l'oldList. Avez-vous au moins testé cela ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X