Как клонировать общий список в Java?
у меня есть ArrayList<String>
что я хотел бы вернуть копию. ArrayList
имеет метод clone имеет следующую подпись:
public Object clone()
после вызова этого метода, как мне вернуть возвращаемый объект в ArrayList<String>
?
13 ответов
зачем тебе клон? Создание нового списка обычно имеет больше смысла.
List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);
работу.
Это код, который я использую для этого:
ArrayList copy = new ArrayList (original.size());
Collections.copy(copy, original);
Надежда полезна для вас
имейте в виду, что объект.clone () имеет некоторые серьезные проблемы, и его использование в большинстве случаев не рекомендуется. Пожалуйста см. деталь 11, от"Эффективная Java" Джошуа блох для полного ответа. Я считаю, что вы можете безопасно использовать объект.clone () на массивах примитивного типа, но кроме этого вам нужно быть разумным в правильном использовании и переопределении clone. Вероятно, вам лучше определить конструктор копирования или статический заводской метод, который явно клонирует объект в соответствии с вашим семантика.
Я думаю, что это должно сделать трюк, используя API коллекций:
Примечание: метод копирования выполняется в линейном времени.
//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);
С Java 8 его можно клонировать потоком.
import static java.util.stream.Collectors.toList;
...
List<AnObject> clone = myList.stream().collect(toList());
Если вы хотите, чтобы это могло вернуть список в геттере, было бы лучше сделать:
ImmutableList.copyOf(list);
Я считаю, что использование addAll работает нормально.
ArrayList<String> copy = new ArrayList<String>();
copy.addAll(original);
скобки используются, а не синтаксис дженериков
клонировать общий интерфейс, как java.util.List
вам просто нужно бросить его. вот вам пример:
List list = new ArrayList();
List list2 = ((List) ( (ArrayList) list).clone());
это немного сложно, но он работает, если вы ограничены, чтобы вернуть List
интерфейс, так что любой после вас может реализовать свой список, когда захочет.
Я знаю, что этот ответ близок к окончательному ответу, но мой ответ отвечает, Как сделать все это, пока вы работаете с List
- общий родитель-не ArrayList
будьте очень осторожны при клонировании ArrayLists. Клонирование на java является мелким. Это означает, что он будет клонировать только сам Arraylist, а не его члены. Поэтому, если у вас есть ArrayList X1 и клонировать его в X2 любое изменение в X2 также будет проявляться в X1 и наоборот. При клонировании вы будете генерировать только новый ArrayList с указателями на те же элементы в оригинале.
Это должно работать:
ArrayList<String> orig = new ArrayList<String>();
ArrayList<String> copy = (ArrayList<String>) orig.clone()
Я не профессионал java, но у меня такая же проблема, и я попытался решить этот метод. (Предположим, что T имеет конструктор копирования).
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);
}
}