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



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



public Object clone()


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

654   13  

13 ответов:

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

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

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()
ArrayList first = new ArrayList ();
ArrayList copy = (ArrayList) first.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

    Ничего не найдено.