J'ai quelques structures de données, et j'aimerais en utiliser une à titre temporaire et une autre 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 ceci est bien sûr que myObject
ne pointe en réalité que sur myTempObject
, et donc une fois que myTempObject
est effacé, il en est de même de myObject
.
Comment conserver les valeurs de myTempObject
dans myObject
en utilisant java?
Vous pouvez utiliser un tel truc:
myObject = new ArrayList<Object>(myTempObject);
ou utiliser
myObject = (ArrayList<Object>)myTempObject.clone();
Vous pouvez obtenir des informations sur la méthode clone () ici
Mais vous devriez vous rappeler que tous ces moyens vous donneront une copie de votre liste , pas tous ses éléments. Ainsi, si vous modifiez l'un des éléments de votre liste copiée, il le sera également dans votre liste d'origine.
originalArrayList .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. Donc, si vous modifiez l’un d’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 dans copyArrayList, comme si vous utilisiez une boucle for ou while.
Aucune copie implicite n'est créée dans Java via l'opérateur d'affectation. Les variables contiennent une valeur de référence (pointeur) et lorsque vous utilisez =
, vous ne modifiez 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 une autre ArrayList
:
ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);
Edit: Comme le souligne Bohemian dans les commentaires ci-dessous, est-ce ce que vous demandez? En procédant de la manière décrite ci-dessus, ArrayList
s (myTempObject
et myObject
) contiendraient des références aux mêmes objets . Si vous souhaitez réellement une nouvelle liste contenant de nouvelles copies des objets contenus dans myTempObject
, vous devez créer une copie de chaque objet individuel dans l'original ArrayList
.
Je suis tombé sur ce problème tout en faisant face au même problème.
Dire arraylist1 = arraylist2 les place tous les deux pour qu'ils pointent au même endroit. Ainsi, si vous modifiez les données altérées, les deux listes restent toujours identiques.
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 liste1 de la manière que vous êtes actuellement.
foreach(<type> obj in list1)
{
list2.Add(obj);
}
Supopose vous voulez 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.
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 impression sortie comme ci-dessous
Un
Deux
Trois
Quatre
Cinq
Six
Nous pouvons également le faire en utilisant la méthode clone () qui est utilisée pour créer une copie exacte.
pour cela essayez 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());
}**
Vous devez clone()
l'objet individuel. Constructor
et d'autres méthodes effectuent une copie superficielle. Vous pouvez essayer la méthode Collections.copy .
Un moyen simple de créer une copie complète de la liste originale consiste à ajouter tous les éléments d’une liste à une autre.
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.
Supposons que vous avez deux listes de noms 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 second tableau dans le premier répertoire comme ceci,
firstArrayList = new ArrayList<>(secondArrayList );
Terminé!!
Voici une solution de contournement pour copier tous les objets d'un tableau dans 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. vous pouvez donc copier tout ou partie de la liste de tableaux.
pour copier une liste dans une autre liste, vous pouvez utiliser la méthode appelée Collection.copy (myObject myTempObject). À présent, après avoir exécuté cette ligne de code, vous pouvez voir toutes les valeurs de liste dans myObject.
Copier une liste en une seconde est assez simple, vous pouvez le faire comme suit: -
ArrayList<List1> list1= new ArrayList<>();
ArrayList<List1> list2= new ArrayList<>();
//this will your copy your list1 into list2
list2.addAll(list1);