Ich habe einige Datenstrukturen und möchte eine als temporäre und eine andere als nicht temporäre verwenden.
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();
Jetzt ist das Problem dabei natürlich, dass myObject
es wirklich nur darauf hinweist myTempObject
, und so ist es einmal myTempObject
geklärt, so ist es auch myObject
.
Wie behalte ich die Werte myTempObject
bei der myObject
Verwendung von Java bei?
List.addAll
. Wenn Sie jedoch alle Objekte behalten müssen, wird durch das Löschen der temporären Liste nicht wirklich viel Speicherplatz gelöscht. Weil Sie nur versuchen, die Referenzen zu löschen, soweit Sie Objekte behalten möchten.Antworten:
Sie können einen solchen Trick anwenden:
oder verwenden
Informationen zur clone () -Methode finden Sie hier
Sie sollten sich jedoch daran erinnern, dass Sie auf all diese Arten eine Kopie Ihrer Liste erhalten , nicht alle ihrer Elemente. Wenn Sie also eines der Elemente in Ihrer kopierten Liste ändern, wird es auch in Ihrer ursprünglichen Liste geändert.
quelle
Object
es immer als Referenz zugewiesen. Übrigensclone()
ist eine flache Kopie und wird nicht die enthaltenen kopierenObjects
, sondern Verweise auf sie. Wenn Sie eine Deep-Copy erstellenoldList = newList
?originalArrayList. addAll (copyArrayList);
Hinweis : Wenn Sie zum Kopieren die Methode addAll () verwenden, verweist der Inhalt der beiden Array-Listen (originalArrayList und copyArrayList) auf dieselben Objekte oder Inhalte. Wenn Sie also eine davon ändern, spiegelt auch die andere die gleiche Änderung wider.
Wenn Sie dies nicht möchten, müssen Sie jedes Element aus der ursprünglichenArrayList in die copyArrayList kopieren, z. B. mithilfe einer for- oder while-Schleife.
quelle
In Java werden keine impliziten Kopien über den Zuweisungsoperator erstellt. Variablen enthalten einen Referenzwert (Zeiger), und wenn Sie ihn verwenden
=
, kopieren Sie nur diesen Wert.Um den Inhalt von
myTempObject
Ihnen zu erhalten , müssten Sie eine Kopie davon erstellen.Dies kann erreicht werden, indem
ArrayList
mit dem Konstruktor, der einen anderen verwendet , ein neuer erstellt wirdArrayList
:Bearbeiten: Wie Bohemian in den Kommentaren unten betont, ist dies das, was Sie fragen? Auf diese Weise würden sowohl
ArrayList
s (myTempObject
als auchmyObject
) Verweise auf dieselben Objekte enthalten. Wenn Sie tatsächlich eine neue Liste wünschen, die neue Kopien der darin enthaltenen Objekte enthält, müssenmyTempObject
Sie eine Kopie jedes einzelnen Objekts im Original erstellenArrayList
quelle
clear()
vonArrayList
myTempObject
keine Auswirkungen auf die darin enthaltenen Objekte haben würde. Wenn er neue Kopien der in der Liste enthaltenen Objekte haben wollte, ist das eine andere Geschichte, aber ich habe diese Frage nicht so interpretiert.Kam darüber hinweg, während ich mich dem gleichen Problem stellte.
Wenn Sie arraylist1 = arraylist2 sagen, werden beide so eingestellt, dass sie auf dieselbe Stelle zeigen. Wenn Sie also eine der Datenänderungen ändern, bleiben beide Listen immer gleich.
Um Werte in eine unabhängige Liste zu kopieren, habe ich nur foreach verwendet, um den Inhalt zu kopieren:
Füllen Sie list1 so aus, wie Sie gerade sind.
quelle
Angenommen, Sie möchten oldList in ein neues ArrayList-Objekt namens newList kopieren
Diese beiden Listen sind unabhängig voneinander. Änderungen an einer Liste werden nicht an die andere weitergegeben.
quelle
Versuchen wir das Beispiel
In Druckausgabe wie unten
Eins
zwei
drei
vier
fünf
sechs
Wir können dies auch mit der Methode clone () tun, mit der eine exakte Kopie erstellt wird
Für diesen Versuch können Sie versuchen, wie
quelle
Sie müssen auf
clone()
das einzelne Objekt.Constructor
und andere Methoden führen eine flache Kopie durch. Sie können die Methode Collections.copy ausprobieren .quelle
Collections.copy
ist kaputt. Erstens ist es irreführend zu sagen, dass Elemente kopiert werden, während sie nur in einer neuen Liste referenziert werden. Zweitens müssen Sie bereits eine Zielliste haben, deren Größe nicht niedriger als die Quellliste ist ...Eine einfache Möglichkeit, eine tiefe Kopie der Originalliste zu erstellen, besteht darin, alle Elemente von einer Liste zu einer anderen Liste hinzuzufügen.
Wenn Sie jetzt Änderungen an originalList vornehmen, hat dies keine Auswirkungen auf duplicateList.
quelle
Um eine Liste in die andere Liste zu kopieren, können Sie die Methode Collection.copy (myObject myTempObject) verwenden. Jetzt können Sie nach Ausführung dieser Codezeile alle Listenwerte im myObject anzeigen.
quelle
quelle
Hier ist eine Problemumgehung, um alle Objekte von einer ArrayList in eine andere zu kopieren:
subList soll eine Liste mit einem Datenbereich zurückgeben. So können Sie die gesamte ArrayList oder einen Teil davon kopieren.
quelle
Angenommen, Sie haben zwei Arraylisten vom Typ String. Mögen
Jetzt müssen wir die Daten des zweiten Arrays wie folgt in die erste Arrayliste kopieren.
Getan!!
quelle