Ich habe eine ArrayList
l1
Größe 10. Ich ordne l1
einen neuen Listenreferenztyp zu l2
. Will l1
und l2
zeige auf dasselbe ArrayList
Objekt? Oder ist eine Kopie des ArrayList
Objekts zugeordnet l2
?
Wenn l2
ich bei der Verwendung der Referenz das Listenobjekt aktualisiere, werden auch die Änderungen im l1
Referenztyp berücksichtigt.
Beispielsweise:
List<Integer> l1 = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
l1.add(i);
}
List l2 = l1;
l2.clear();
Gibt es keine andere Möglichkeit, einer neuen Referenzvariablen eine Kopie eines Listenobjekts zuzuweisen, als zwei Listenobjekte zu erstellen und Sammlungen von alt nach neu zu kopieren?
List.subList
, um eine "Ansicht" auf einen Abschnitt der ursprünglichen Liste zu erhalten.(ArrayList<ArrayList<Object>>)
? Würde dies rekursiv Kopien aller untergeordneten ArrayList-Objekte erstellen?Versuchen zu benutzen
Collections.copy(destination, source);
quelle
new ArrayList<>(source);
?Collections.copy
ist überhaupt keine Alternative zunew ArrayList<>(source)
. TatsächlichCollections.copy
wird davon ausgegangen, dass der Bereichdestination.size()
mindestens so groß istsource.size()
, und der Bereich wird dann indexweise mit derset(int,E)
Methode kopiert . Die Methode fügt dem Ziel keine neuen Elemente hinzu. Lesen Sie den Quellcode, wenn er im Javadoc nicht klar genug ist.Ja
l1
undl2
zeigt auf dieselbe Referenz, dasselbe Objekt.Wenn Sie eine neue ArrayList basierend auf der anderen ArrayList erstellen möchten, gehen Sie folgendermaßen vor:
Das Ergebnis wird
l1
weiterhin 2 Elemente undl2
3 Elemente enthalten.quelle
List<String> l2 = new ArrayList<String>(l1)
und erklärenList<String> l2 = l1
?Eine weitere bequeme Möglichkeit, die Werte von src ArrayList nach dest Arraylist zu kopieren, ist folgende:
Dies ist das tatsächliche Kopieren von Werten und nicht nur das Kopieren von Referenzen.
quelle
Es gibt eine Methode addAll (), die zum Kopieren einer ArrayList in eine andere dient.
Sie haben beispielsweise zwei Array-Listen: sourceList und targetList . Verwenden Sie den folgenden Code.
targetList.addAll (sourceList);
quelle
Java übergibt keine Objekte, sondern Referenzen (Zeiger) an Objekte. Ja, l2 und l1 sind zwei Zeiger auf dasselbe Objekt.
Sie müssen eine explizite Kopie erstellen, wenn Sie zwei verschiedene Listen mit demselben Inhalt benötigen.
quelle
List.copyOf
➙ nicht änderbare ListeDu hast gefragt:
Java 9 brachte die
List.of
Methoden zur Verwendung von Literalen, um eine nicht modifizierbareList
unbekannte konkrete Klasse zu erstellen .Zusammen mit dem haben wir auch
List.copyOf
. Auch diese Methode gibt eine nicht modifizierbareList
unbekannte konkrete Klasse zurück.Mit "nicht modifizierbar" meinen wir die Anzahl der Elemente in der Liste, und der Objektreferenz, der in jedem Slot als Element gespeichert ist, ist fest. Sie können keine Elemente hinzufügen, löschen oder ersetzen. Der in jedem Element enthaltene Objektbezug kann jedoch veränderlich sein oder nicht .
Sehen Sie diesen Code live auf IdeOne.com .
Sie haben nach Objektreferenzen gefragt. Wie bereits erwähnt, haben Sie nur eine Liste, wenn Sie eine Liste erstellen und zwei Referenzvariablen (Zeigern) zuweisen. Beide zeigen auf dieselbe Liste. Wenn Sie einen der beiden Zeiger zum Ändern der Liste verwenden, werden die Änderungen später in beiden Zeigern angezeigt, da sich nur eine Liste im Speicher befindet.
Sie müssen also eine Kopie der Liste erstellen. Wenn Sie möchten, dass diese Kopie nicht geändert werden kann, verwenden Sie die
List.copyOf
in dieser Antwort beschriebene Methode. Bei diesem Ansatz erhalten Sie zwei separate Listen mit Elementen, die einen Verweis auf dieselben Inhaltsobjekte enthalten. In unserem obigen Beispiel, in demString
Objekte zur Darstellung von Farben verwendet werden, schweben die Farbobjekte beispielsweise irgendwo im Speicher herum. Die beiden Listen enthalten Zeiger auf dieselben Farbobjekte. Hier ist ein Diagramm.Die erste Liste kann
colors
geändert werden. Dies bedeutet, dass einige Elemente entfernt werden können, wie im obigen Code gezeigt, wo wir das ursprüngliche 3. Element entfernt habenChartreuse
(Index von 2 = Ordnungszahl 3). Und Elemente können hinzugefügt werden. Und die Elemente können geändert werden, um auf andereString
wieOliveDrab
oder zu verweisenCornflowerBlue
.Im Gegensatz dazu sind die vier Elemente von
masterColors
festgelegt. Kein Entfernen, kein Hinzufügen und kein Ersetzen einer anderen Farbe. DieseList
Implementierung ist nicht veränderbar.quelle