Как мне клонировать общий список в Java? - PullRequest
144 голосов
/ 10 сентября 2008

У меня есть ArrayList<String>, который я хотел бы вернуть копию. ArrayList имеет метод клонирования со следующей подписью:

public Object clone()

После того, как я вызову этот метод, как мне вернуть возвращенный Объект обратно к ArrayList<String>?

Ответы [ 14 ]

306 голосов
/ 11 сентября 2008

Почему вы хотите клонировать? Создание нового списка обычно имеет больше смысла.

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

Работа выполнена.

55 голосов
/ 10 сентября 2008
ArrayList newArrayList = (ArrayList) oldArrayList.clone();
20 голосов
/ 20 апреля 2012

Это код, который я использую для этого:

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

Надежда полезна для вас

19 голосов
/ 26 января 2016

С Java 8 его можно клонировать с потоком.

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

...

List<AnObject> clone = myList.stream().collect(toList());
16 голосов
/ 08 декабря 2008

Имейте в виду, что Object.clone () имеет некоторые серьезные проблемы, и его использование не рекомендуется в большинстве случаев. Пожалуйста, см. Пункт 11 из " Effective Java " Джошуа Блоха для полного ответа. Я полагаю, что вы можете безопасно использовать Object.clone () в массивах примитивных типов, но помимо этого вы должны быть осторожны с правильным использованием и переопределением клона. Возможно, вам лучше определить конструктор копирования или метод статической фабрики, который явно клонирует объект в соответствии с вашей семантикой.

14 голосов
/ 10 сентября 2008

Я думаю, что это должно сработать, используя API коллекций:

Примечание : метод копирования выполняется за линейное время.

//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);
8 голосов
/ 10 сентября 2008

Я считаю, что с помощью addAll все работает нормально.

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

используются круглые скобки, а не общий синтаксис

6 голосов
/ 16 февраля 2016

Если вы хотите это для того, чтобы иметь возможность возвращать список в геттере, было бы лучше сделать:

ImmutableList.copyOf(list);
3 голосов
/ 11 сентября 2014

Чтобы клонировать универсальный интерфейс, такой как java.util.List, вам просто нужно его привести. вот вам пример:

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

Это немного сложно, но это работает, если вы ограничены в возврате интерфейса List, так что любой после вас может реализовать свой список, когда захочет.

Я знаю, что этот ответ близок к окончательному ответу, но мой ответ отвечает, как делать все это, пока вы работаете с List - родителем-родителем - не ArrayList

2 голосов
/ 01 марта 2009

Будьте очень осторожны при клонировании ArrayLists. Клонирование в Java мелкое. Это означает, что он будет клонировать только самого Arraylist, а не его членов. Поэтому, если у вас есть ArrayList X1 и клонируйте его в X2, любое изменение в X2 также проявится в X1 и наоборот. При клонировании вы будете генерировать только новый ArrayList с указателями на те же элементы в оригинале.

...