У меня есть, ArrayList<String>
что я хотел бы вернуть копию. ArrayList
имеет метод клона, который имеет следующую подпись:
public Object clone()
После того, как я вызову этот метод, как я приведу возвращенный объект обратно ArrayList<String>
?
Ответы:
источник
ArrayList<String> newArrayList = (ArrayList<String>) oldArrayList.clone();
.List<String>
вместоArrayList<String>
левой стороны. Именно так коллекции должны использоваться большую часть времени.Почему вы хотите клонировать? Создание нового списка обычно имеет больше смысла.
Работа выполнена.
источник
ArrayList(Collection<? extends E> c)
означает, что не имеет значения, какой список вы используете в качестве аргумента.Вот код, который я использую для этого:
Надежда полезна для вас
источник
ArrayList
использованияArrayList<YourObject>
ArrayList
конструктора?С Java 8 это может быть клонировано с потоком.
...
источник
toCollection
может быть лучшим выборомИмейте в виду, что Object.clone () имеет некоторые серьезные проблемы, и его использование не рекомендуется в большинстве случаев. Пожалуйста, см. Пункт 11 из « Эффективной Явы » Джошуа Блоха для полного ответа. Я полагаю, что вы можете безопасно использовать Object.clone () в массивах примитивного типа, но помимо этого вы должны быть осторожны в правильном использовании и переопределении клона. Возможно, вам лучше определить конструктор копирования или статический метод фабрики, который явно клонирует объект в соответствии с вашей семантикой.
источник
Я думаю, что это должно сработать, используя Collections API:
Примечание : метод копирования выполняется за линейное время.
источник
List<MySerializableObject> copyList = new ArrayList<>(mMySerializableObjects.size());
Кажется, использованиеcopyList.addAll(original);
- хорошая альтернативаint
аргументов. Я понятия не имею, почему вы хотите использовать этот неясный статический метод вместо старогоaddAll
.Я нахожу, используя addAll работает отлично.
используются скобки, а не синтаксис обобщения
источник
new ArrayList<String>(original)
?Если вы хотите это для того, чтобы иметь возможность возвращать список в получателе, было бы лучше сделать:
источник
Для клонирования общего интерфейса, подобного
java.util.List
вам, нужно просто привести его. вот вам пример:Это немного сложно, но это работает, если вы ограничены в возврате
List
интерфейса, так что любой после вас может реализовать свой список, когда захочет.Я знаю, что этот ответ близок к окончательному ответу, но мой ответ отвечает, как сделать все это, пока вы работаете с
List
родителем-родителем, а неArrayList
источник
Будьте очень осторожны при клонировании ArrayLists. Клонирование в Java мелкое. Это означает, что он будет клонировать только самого Arraylist, а не его членов. Таким образом, если у вас есть ArrayList X1 и клонируйте его в X2, любое изменение в X2 также проявится в X1 и наоборот. При клонировании вы будете генерировать только новый ArrayList с указателями на те же элементы в оригинале.
источник
Это также должно работать:
источник
Имейте в виду, что это только мелкая, а не глубокая копия, т.е. Вы получаете новый список, но записи совпадают. Это не проблема для простых строк. Получить еще сложнее, когда записи списка сами являются объектами.
источник
источник
Я не профессионал Java, но у меня та же проблема, и я пытался решить с помощью этого метода. (Предполагается, что T имеет конструктор копирования).
источник
List
класс реализации имеет открытый конструктор без аргументов. Например,List
s возвращаетArray.asList
,List.of
или,List.subList
возможно, нет.