Frage

ich habe ein ArrayList<String> von dem ich gerne eine Kopie zurückgeben würde. ArrayList verfügt über eine Klonmethode mit der folgenden Signatur:

public Object clone()

Wie kann ich das zurückgegebene Objekt nach dem Aufruf dieser Methode zurück umwandeln? ArrayList<String>?

War es hilfreich?

Lösung

ArrayList newArrayList = (ArrayList) oldArrayList.clone();

Andere Tipps

Warum würden Sie klonen möchten? macht mehr Sinn, in der Regel eine neue Liste erstellen.

List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);

Job gemacht.

Dies ist der Code, den ich dafür verwenden:

ArrayList copy = new ArrayList (original.size());
Collections.copy(copy, original);

Die Hoffnung ist nützlich für Sie

Mit Java 8 kann mit einem Strom geklont werden.

import static java.util.stream.Collectors.toList;

...

List<AnObject> clone = myList.stream().collect(toList());

Beachten Sie, dass Object.clone () einige große Probleme hat, und seine Verwendung ist in den meisten Fällen abgeraten. Bitte beachten Sie Punkt 11, von " Effective Java " von Joshua Bloch für eine vollständige Antwort. Ich glaube, Sie sicher Object.clone () auf primitive Art Arrays verwenden können, aber abgesehen davon, dass Sie richtig mit und überwiegendes Klon vernünftig sein müssen. Sie sind wahrscheinlich besser dran, einen Copy-Konstruktor oder eine statische Factory-Methode definiert, die das Objekt explizit klont nach Ihrer Semantik.

Ich denke, das sollte den Trick tun, um die Sammlungen API:

Hinweis : Die Kopiermethode in linearer Zeit läuft.

//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);

Ich finde mit addAll funktioniert.

ArrayList<String> copy = new ArrayList<String>();
copy.addAll(original);

Klammern werden verwendet, anstatt die Generika-Syntax

Wenn Sie dies wollen, um die Liste in einem Getter zurückkehren zu können, wäre es besser, zu tun:

ImmutableList.copyOf(list);

Um eine generische Schnittstelle wie java.util.List klonen werden Sie nur brauchen, es zu werfen. hier sind Sie ein Beispiel:

List list = new ArrayList();
List list2 = ((List) ( (ArrayList) list).clone());

Es ist ein bisschen schwierig, aber es funktioniert, wenn Sie eine List Schnittstelle begrenzt zurückkehren, so dass jeder, nachdem Sie können Ihre Liste implementieren, wann immer er will.

Ich weiß, diese Antwort auf die endgültige Antwort der Nähe ist, aber meine Antwort beantwortet, wie all das zu tun, während Sie -die allgemeine Eltern- nicht List

mit ArrayList arbeiten

Seien Sie sehr vorsichtig, wenn Arraylisten klonen. in Java-Klonen ist flach. Das bedeutet, dass es nur der Arraylist klonen sich und ihre Mitglieder nicht. Also, wenn Sie eine Arraylist X1 haben und klonen es in X2 jede Änderung X2 wird auch manifest in X1 und umgekehrt. Wenn Sie klonen werden Sie nur eine neue Arraylist mit Zeigern auf die gleichen Elemente in den ursprünglichen erzeugen.

Dies sollte auch funktionieren:

ArrayList<String> orig = new ArrayList<String>();
ArrayList<String> copy = (ArrayList<String>) orig.clone()
ArrayList first = new ArrayList ();
ArrayList copy = (ArrayList) first.clone ();

Ich bin keine Java-Profi, aber ich habe das gleiche Problem und ich versuchte, mit dieser Methode zu lösen. (Es nehme an, dass T eine Kopie Konstruktor).

 public static <T extends Object> List<T> clone(List<T> list) {
      try {
           List<T> c = list.getClass().newInstance();
           for(T t: list) {
             T copy = (T) t.getClass().getDeclaredConstructor(t.getclass()).newInstance(t);
             c.add(copy);
           }
           return c;
      } catch(Exception e) {
           throw new RuntimeException("List cloning unsupported",e);
      }
}
List<String> shallowClonedList = new ArrayList<>(listOfStrings);

Beachten Sie, dass dies nur eine seichte nicht eine tiefe Kopie, dh. Sie erhalten eine neue Liste, aber die Einträge sind gleich. Das ist kein Problem für einfach Strings. Erhalten Sie ist komplizierter, wenn die Listeneinträge Objekte für sich alleine.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top