2015-05-27 6 views
5

Ich kann nicht nur die ursprüngliche Liste ändern. DieseListe am Ende einer anderen Liste hinzufügen (nicht nur Referenzen kopieren)

ist, wie ich habe es getan gesehen:

List<String> l1 = new ArrayList<String>(); 
l1.add("Hello"); 
l1.add("World"); 
List<String> l2 = new ArrayList<String>(l1); //A new arrayList. 
l2.add("Everybody"); 

So würde ich jetzt eine neue Liste, die eine Kopie des ersten ist. Und ich kann die zweite ändern, ohne dass die erste geändert wird.

Und jetzt habe ich Probleme zu verstehen, wie das Gleiche zu tun, aber die Elemente am Ende der Liste hinzufügen.

Was ich tat, tat genau den obigen Code und fügte die Liste zu einer anderen Liste hinzu. Zum Beispiel mit addAll. Aber ich sehe überall, dass das nur Verweise kopiert und so weiter. Wenn es also in einer Methode oder in einem Rmi-Code ist, würde die Liste selbst nicht vollständig sein, es würde Verweise auf die andere Liste erhalten, die ich gerade erstellt habe.

Da muss ich dies für viele Arten von Liste nicht sicher, ob Artikel für Artikel ist ideal. Also muss ich am Ende einer anderen Liste eine Liste hinzufügen, wenn das überhaupt möglich ist.

+0

Welche Elemente möchten Sie an welches Ende der Liste hinzufügen? Objektlisten enthalten immer nur Referenzen, so dass Sie Referenzen nur von einer Liste in eine andere kopieren können, wenn Sie den Konstruktor oder das Adall für diese Frage verwenden – LionC

+0

Es kopiert Referenzen der hinzugefügten Elemente, nicht der Liste. Und das gilt auch für die Methode, die Sie gezeigt haben (mit der 'new ArrayList (l1)'). – RealSkeptic

+0

Das Kopieren von Verweisen auf unveränderliche Klassen sollte kein Problem sein. 'Saiten sind unveränderlich. – fabian

Antwort

6

addAll kopiert Referenzen der Elemente der Quellenliste an das Ende der Zielliste, es kopiert keinen Verweis auf die Quellenliste.

Dies ist nicht anders als der Konstruktor, den Sie verwenden - new ArrayList<String>(l1) - tut. Wenn einer Ihren Anforderungen entspricht, dann auch der andere.

BTW, im Falle einer Liste einer unveränderlichen Klasse, wie String, ist es nicht wichtig, dass die Verweise auf die Elemente kopiert werden (im Gegensatz zu Kopien der Elemente), da Sie nicht ändern können die Elemente, also nichts, was Sie tun können, um den Inhalt der zweiten Liste wird den Inhalt der ursprünglichen Liste beeinflussen.

+0

halten. Alles klar, wusste das nicht. Aber das bedeutet, dass, wenn ich eine Liste modifiziere, ich beide modifiziere, nicht wahr? Wie vermeide ich das? Ich möchte eine Kopie der Liste, am Ende eines zuvor erstellten, wenn möglich – keont

+0

@keont Um es einfach auszudrücken. Die "Objekte" werden referenziert, nicht die "Liste" –

+0

@keont Nein, wenn Sie Elemente aus einer Liste hinzufügen oder entfernen, bleibt die andere unverändert. – Eran

0

Sie sagen, dass Sie die neue Liste ändern möchten, ohne die alte zu beeinflussen, dann aber beschweren, dass nur Referenzen gespeichert werden. Versuchen Sie, die neue Liste oder die darin enthaltenen Objekte zu ändern?

+0

Dies ist nirgendwo eine Antwort.Dies sollte ein Kommentar gewesen sein und ich weiß, dass Sie c Ich möchte einen Kommentar mit Ihrem schlechten Ruf schreiben, aber es ist nicht schwer, etwas zu bekommen. –

Verwandte Themen