Как клонировать общий список в Java?

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

public Object clone()

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

Ответ 1

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

Ответ 2

Зачем вам клонировать? Обычно создается новый список.

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

Задание выполнено.

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

...

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

Ответ 7

Я нахожу, что использование addAll отлично работает.

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

используются скобки, а не синтаксис generics

Ответ 8

Если вы хотите это, чтобы иметь возможность вернуть List в getter, вам лучше сделать:

ImmutableList.copyOf(list);

Ответ 9

Это также должно работать:

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

Ответ 10

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

Ответ 11

Моя функция клонировать список с типом:

public static <T extends Object> List<T> cloneList(List<T> list) {
    return ((List<T>) ((ArrayList<T>) list).clone());
}

Ответ 12

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

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

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

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

Ответ 13

ArrayList first = new ArrayList ();
ArrayList copy = (ArrayList) first.clone ();

Ответ 14

Я не профессионал 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);
      }
}