У мене є ArrayList<String>
те, що я хотів би повернути копію. ArrayList
має метод клонування, який має такий підпис:
public Object clone()
Як я зателефоную цьому методу, як я можу повернути повернутий Об'єкт назад ArrayList<String>
?
У мене є ArrayList<String>
те, що я хотів би повернути копію. ArrayList
має метод клонування, який має такий підпис:
public Object clone()
Як я зателефоную цьому методу, як я можу повернути повернутий Об'єкт назад ArrayList<String>
?
Відповіді:
ArrayList newArrayList = (ArrayList) oldArrayList.clone();
ArrayList<String> newArrayList = (ArrayList<String>) oldArrayList.clone();
.
List<String>
замість ArrayList<String>
лівого боку. Ось як колекції слід використовувати більшу частину часу.
Чому б ви хотіли клонувати? Створення нового списку зазвичай має більше сенсу.
List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);
Робота виконана.
ArrayList(Collection<? extends E> c)
означає, що не має значення, який список ви використовуєте в якості аргументу.
Це код, який я використовую для цього:
ArrayList copy = new ArrayList (original.size());
Collections.copy(copy, original);
Надія корисна для вас
ArrayList
використанняArrayList<YourObject>
ArrayList
конструктора?
З Java 8 його можна клонувати потоком.
import static java.util.stream.Collectors.toList;
...
List<AnObject> clone = myList.stream().collect(toList());
toCollection
може бути кращим вибором.
Зауважте, що у Object.clone () є деякі основні проблеми, і його використання в більшості випадків перешкоджає. Щоб отримати повну відповідь, див. Пункт 11, " Ефективна Java " Джошуа Блоха. Я вважаю, що ви можете безпечно використовувати Object.clone () на масивах примітивних типів, але крім цього вам потрібно бути розумним щодо правильного використання та перекриття клону. Вам, мабуть, краще визначити конструктор копій або статичний заводський метод, який явно клонує об’єкт відповідно до вашої семантики.
Я думаю, що для цього слід зробити фокус за допомогою API Collections:
Примітка : метод копіювання працює в лінійний час.
//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);
List<MySerializableObject> copyList = new ArrayList<>(mMySerializableObjects.size());
Здається, використання copyList.addAll(original);
хорошої альтернативи
int
аргументів. Я не знаю, чому ви хочете використовувати цей незрозумілий статичний метод замість старого доброго addAll
.
Я вважаю, що використання AddAll працює чудово.
ArrayList<String> copy = new ArrayList<String>();
copy.addAll(original);
використовуються дужки, а не синтаксис generics
new ArrayList<String>(original)
?
Щоб клонувати такий загальний інтерфейс, як java.util.List
вам просто, потрібно його передати. ось вам приклад:
List list = new ArrayList();
List list2 = ((List) ( (ArrayList) list).clone());
Це трохи хитро, але це працює, якщо ви обмежуєте повернення List
інтерфейсу, тож кожен, хто зможе реалізувати свій список, коли захоче.
Я знаю, що ця відповідь близька до остаточної відповіді, але моя відповідь дає відповіді на те, як все це робити, коли ви працюєте з List
-загальним батьком-ArrayList
Будьте дуже обережні, клонуючи ArrayLists. Клонування в Яві неглибоке. Це означає, що він буде клонувати лише самого Arraylist, а не його членів. Отже, якщо у вас є ArrayList X1 і клонує його в X2, будь-яка зміна X2 також проявиться в X1 і навпаки. Коли ви клонуєте, ви генеруєте лише новий ArrayList з покажчиками на ті самі елементи в оригіналі.
Я не професіонал 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
клас реалізації має публічний конструктор no-arg. Наприклад, List
s повертається Array.asList
, List.of
або, List.subList
ймовірно, ні.