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); } }
Comments