Вопрос

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

public Object clone()

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

Это было полезно?

Решение

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

Другие советы

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

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

Дело сделано.

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

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

Надеюсь, вам будет полезно

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

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

...

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

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

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

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

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

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

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

вместо универсального синтаксиса используются круглые скобки

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

ImmutableList.copyOf(list);

Чтобы клонировать общий интерфейс, например 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);
      }
}
List<String> shallowClonedList = new ArrayList<>(listOfStrings);

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top