Ich habe eine ArrayList<String>
, von der ich eine Kopie zurückgeben möchte. ArrayList
hat eine Klonmethode mit der folgenden Signatur:
public Object clone()
Wie kann ich das zurückgegebene Objekt nach dem Aufrufen dieser Methode zurücksetzen ArrayList<String>
?
Antworten:
quelle
ArrayList<String> newArrayList = (ArrayList<String>) oldArrayList.clone();
.List<String>
stattArrayList<String>
auf der linken Seite. So sollten Sammlungen die meiste Zeit verwendet werden.Warum sollten Sie klonen wollen? Das Erstellen einer neuen Liste ist normalerweise sinnvoller.
Job erledigt.
quelle
ArrayList(Collection<? extends E> c)
bedeutet, dass es keine Rolle spielt, welche Art von Liste Sie als Argument verwenden.Dies ist der Code, den ich dafür verwende:
Hoffnung ist nützlich für Sie
quelle
ArrayList
ArrayList<YourObject>
ArrayList
Konstruktors verwenden?Mit Java 8 kann es mit einem Stream geklont werden.
...
quelle
toCollection
kann eine bessere Wahl sein.Beachten Sie, dass Object.clone () einige Hauptprobleme aufweist und von der Verwendung in den meisten Fällen abgeraten wird. Eine vollständige Antwort finden Sie unter Punkt 11 aus " Effective Java " von Joshua Bloch. Ich glaube, Sie können Object.clone () sicher für primitive Arrays verwenden, aber ansonsten müssen Sie vorsichtig sein, wenn Sie den Klon richtig verwenden und überschreiben. Sie sind wahrscheinlich besser dran, einen Kopierkonstruktor oder eine statische Factory-Methode zu definieren, die das Objekt explizit gemäß Ihrer Semantik klont.
quelle
Ich denke, dies sollte den Trick mit der Collections-API tun:
Hinweis : Die Kopiermethode wird in linearer Zeit ausgeführt.
quelle
List<MySerializableObject> copyList = new ArrayList<>(mMySerializableObjects.size());
Es scheint, dass die VerwendungcopyList.addAll(original);
eine gute Alternative istint
Argumenten. Ich habe keine Ahnung, warum Sie diese obskure statische Methode anstelle von guten alten verwenden möchtenaddAll
.Ich finde, dass die Verwendung von addAll gut funktioniert.
Klammern werden anstelle der generischen Syntax verwendet
quelle
new ArrayList<String>(original)
?Wenn Sie dies möchten, um die Liste in einem Getter zurückgeben zu können, ist es besser, Folgendes zu tun:
quelle
Um eine generische Schnittstelle wie diese zu klonen, müssen
java.util.List
Sie sie nur umwandeln. Hier sind Sie ein Beispiel:Es ist ein bisschen knifflig, aber es funktioniert, wenn Sie nur eine
List
Schnittstelle zurückgeben können, sodass jeder, nachdem Sie Ihre Liste implementiert haben, wann immer er möchte.Ich weiß, dass diese Antwort nahe an der endgültigen Antwort liegt, aber meine Antwort beantwortet, wie das alles zu tun ist, während Sie mit dem
List
generischen Elternteil arbeitenArrayList
quelle
Seien Sie beim Klonen von ArrayLists sehr vorsichtig. Das Klonen in Java ist flach. Dies bedeutet, dass nur die Arraylist selbst und nicht ihre Mitglieder geklont werden. Wenn Sie also eine ArrayList X1 haben und diese in X2 klonen, manifestiert sich jede Änderung in X2 auch in X1 und umgekehrt. Wenn Sie klonen, generieren Sie nur eine neue ArrayList mit Zeigern auf dieselben Elemente im Original.
quelle
Dies sollte auch funktionieren:
quelle
Denken Sie daran, dass dies nur eine flache, keine tiefe Kopie ist, dh. Sie erhalten eine neue Liste, aber die Einträge sind die gleichen. Dies ist kein Problem für einfache Zeichenfolgen. Es wird schwieriger, wenn die Listeneinträge selbst Objekte sind.
quelle
quelle
Ich bin kein Java-Profi, aber ich habe das gleiche Problem und habe versucht, es mit dieser Methode zu lösen. (Es wird angenommen, dass T einen Kopierkonstruktor hat).
quelle
List
Implementierungsklasse einen öffentlichen Konstruktor ohne Argumente hat. Zum Beispiel können dieList
s RenditenArray.asList
,List.of
oderList.subList
wahrscheinlich nicht.