J'ai des structures de données et j'aimerais 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();
maintenant, le problème avec cela, bien sûr, c'est que cela myObject
ne fait que pointer vers myTempObject
, et donc une fois myTempObject
est effacé, il en est de même myObject
.
Comment puis-je conserver les valeurs de myTempObject
en myObject
utilisant java?
List.addAll
. Mais si vous avez besoin de conserver tous les objets, effacer la liste temporaire n'effacera pas vraiment beaucoup de mémoire. Parce que vous essayez seulement d'effacer les références, dans la mesure où vous essayez de les conserver.Réponses:
Vous pouvez utiliser une telle astuce:
myObject = new ArrayList<Object>(myTempObject);
Ou utiliser
Vous pouvez obtenir des informations sur la méthode clone () ici
Mais vous devez vous rappeler que tous ces moyens vous donneront une copie de votre liste , pas tous ses éléments. Donc, si vous modifiez l'un des éléments de votre liste copiée, il sera également modifié dans votre liste d'origine.
la source
Object
affectera toujours par référence. En passant,clone()
c'est une copie superficielle et ne copiera pas le contenuObjects
mais plutôt des références à eux. Si vous voulez faire une copie profonde, jetez un œil à: stackoverflow.com/questions/64036/…oldList = newList
?originalArrayList. addAll (copyArrayList);
Remarque : 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. Donc, si vous modifiez l'un d'entre eux, l'autre reflétera également le même changement.
Si vous ne le souhaitez pas, vous devez copier chaque élément de l'originalArrayList vers le copyArrayList, comme en utilisant une boucle for ou while.
la source
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,
=
vous ne copiez que cette valeur.Afin de préserver le contenu,
myTempObject
vous devez en faire une copie.Cela peut être fait en créant un nouveau en
ArrayList
utilisant le constructeur qui en prend un autreArrayList
:ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);
Edit: Comme le souligne Bohemian dans les commentaires ci-dessous, est-ce ce que vous demandez? En faisant ce qui précède,
ArrayList
s (myTempObject
etmyObject
) contiendraient des références aux mêmes objets. Si vous voulez réellement une nouvelle liste contenant de nouvelles copies des objets contenus dans,myTempObject
vous devrez alors faire une copie de chaque objet individuel dans l'originalArrayList
la source
clear()
leArrayList
myTempObject
n'aurait aucun effet sur les objets qu'il contient. S'il voulait de nouvelles copies des objets contenus dans la liste, c'est une autre histoire, mais ce n'est pas ce que j'ai interprété cette question comme une question.Je suis tombé sur cela en faisant face moi-même au même problème.
Dire arraylist1 = arraylist2 les place tous les deux au même endroit, donc si vous modifiez l'une ou l'autre des modifications de données et ainsi les deux listes restent toujours les mêmes.
Pour copier des valeurs dans une liste indépendante, je viens d'utiliser foreach pour copier le contenu:
ArrayList list1 = new ArrayList(); ArrayList list2 = new ArrayList();
remplissez list1 de la manière dont vous êtes actuellement.
la source
Supposons que vous souhaitiez 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.
la source
Essayons l'exemple
ArrayList<String> firstArrayList = new ArrayList<>(); firstArrayList.add("One"); firstArrayList.add("Two"); firstArrayList.add("Three"); firstArrayList.add("Four"); firstArrayList.add("Five"); firstArrayList.add("Six"); //copy array list content into another array list ArrayList<String> secondArrayList=new ArrayList<>(); secondArrayList.addAll(firstArrayList); //print all the content of array list Iterator itr = secondArrayList.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); }
En sortie d' impression comme ci-dessous
Un
deux
trois
quatre
cinq
six
Nous pouvons également le faire en utilisant la méthode clone () pour laquelle est utilisée pour créer une copie exacte
pour cet essai, vous pouvez essayer comme
**ArrayList<String>secondArrayList = (ArrayList<String>) firstArrayList.clone();** And then print by using iterator **Iterator itr = secondArrayList.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); }**
la source
Vous avez besoin de
clone()
l'objet individuel.Constructor
et d'autres méthodes effectuent une copie superficielle. Vous pouvez essayer la méthode Collections.copy .la source
Collections.copy
est cassé. Premièrement, il est trompeur en disant qu'il copie des éléments, alors qu'il ne les fait référence que dans une nouvelle liste. Deuxièmement, vous devez déjà avoir une liste de destinations dont la taille n'est pas inférieure à la liste source ...Un moyen simple de faire une copie complète de la liste originale est d'ajouter tous les éléments d'une liste à une autre liste.
ArrayList<Object> originalList = new ArrayList<Object>(); ArrayList<Object> duplicateList = new ArrayList<Object>(); for(Object o : originalList) { duplicateList.add(o); }
Maintenant, si vous apportez des modifications à originalList, cela n'aura aucun impact sur duplicateList.
la source
pour copier une liste dans l'autre liste, vous pouvez utiliser la méthode appelée Collection.copy (myObject myTempObject). Maintenant, après avoir exécuté ces lignes de code, vous pouvez voir toutes les valeurs de la liste dans myObject.
la source
ArrayList<List1> list1= new ArrayList<>(); ArrayList<List1> list2= new ArrayList<>(); //this will your copy your list1 into list2 list2.addAll(list1);
la source
Voici une solution de contournement pour copier tous les objets d'un arrayList à un autre:
ArrayList<Object> myObject = new ArrayList<Object>(); ArrayList<Object> myTempObject = new ArrayList<Object>(); myObject.addAll(myTempObject.subList(0, myTempObject.size()));
subList est destiné à renvoyer une liste avec une plage de données. afin que vous puissiez copier l'intégralité de la arrayList ou une partie de celle-ci.
la source
Supposons que vous ayez deux arraylist de type String. Comme
ArrayList<String> firstArrayList ;//This array list is not having any data. ArrayList<String> secondArrayList = new ArrayList<>();//Having some data.
Maintenant, nous devons copier les données du deuxième tableau dans le premier arraylist comme ceci,
firstArrayList = new ArrayList<>(secondArrayList );
Terminé!!
la source