У меня есть ArrayList
l1
размер 10. Я назначаю l1
новому списку ссылочный тип l2
. Будет l1
и l2
указывать на тот же ArrayList
объект? Или копия ArrayList
объекта назначена l2
?
При использовании l2
ссылки, если я обновляю объект списка, он также отражает изменения в l1
типе ссылки.
Например:
List<Integer> l1 = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
l1.add(i);
}
List l2 = l1;
l2.clear();
Нет ли другого способа назначить копию объекта списка новой ссылочной переменной, кроме создания 2 объектов списка и копирования всех коллекций из старого в новое?
List.subList
чтобы "просмотреть" раздел исходного списка.(ArrayList<ArrayList<Object>>)
? будет ли это рекурсивно создавать копии всех дочерних объектов ArrayList?Попробуй использовать
Collections.copy(destination, source);
источник
new ArrayList<>(source);
?Collections.copy
это совсем не альтернативаnew ArrayList<>(source)
. Что наCollections.copy
самом деле делает, так это предполагает, чтоdestination.size()
он по крайней мере такой же большой, какsource.size()
и, затем копирует индекс по индексу диапазона, используяset(int,E)
метод. Метод не добавляет новые элементы к месту назначения. Обратитесь к исходному коду, если он недостаточно понятен из Javadoc.Да
l1
иl2
будет указывать на ту же ссылку, тот же объект.Если вы хотите создать новый ArrayList на основе другого ArrayList, вы делаете это:
Результат будет по-
l1
прежнему иметь 2 элемента иl2
будет иметь 3 элемента.источник
List<String> l2 = new ArrayList<String>(l1)
иList<String> l2 = l1
?Другой удобный способ скопировать значения из src ArrayList в dest Arraylist заключается в следующем:
Это фактическое копирование значений, а не просто копирование ссылок.
источник
Существует метод addAll (), который будет использоваться для копирования одного ArrayList в другой.
Например, у вас есть два списка массивов: sourceList и targetList , используйте приведенный ниже код.
targetList.addAll (SOURCELIST);
источник
Java не передает объекты, она передает ссылки (указатели) на объекты. Так что да, l2 и l1 - два указателя на один и тот же объект.
Вы должны сделать явную копию, если вам нужны два разных списка с одинаковым содержимым.
источник
List.copyOf
➙ неизменяемый списокТы спрашивал:
В Java 9 появились
List.of
методы использования литералов для создания неизменяемогоList
неизвестного конкретного класса.Наряду с этим мы также получили
List.copyOf
. Этот метод также возвращает неизменяемыйList
неизвестный конкретный класс.Под «немодифицируемым» мы подразумеваем количество элементов в списке, а референт объекта, который содержится в каждом слоте как элемент, является фиксированным. Вы не можете добавлять, удалять или заменять элементы. Но объектный референт, содержащийся в каждом элементе, может быть или не быть изменяемым .
Смотрите этот код в прямом эфире на IdeOne.com .
Вы спрашивали об объектных ссылках. Как говорили другие, если вы создаете один список и назначаете его двум ссылочным переменным (указателям), у вас все равно остается только один список. Оба указывают на один и тот же список. Если вы используете любой указатель для изменения списка, оба указателя позже увидят изменения, так как в памяти есть только один список.
Так что вам нужно сделать копию списка. Если вы хотите, чтобы эта копия не изменялась, используйте
List.copyOf
метод, описанный в этом ответе. При таком подходе вы получите два отдельных списка, каждый из которых содержит элементы, которые содержат ссылку на одни и те же объекты содержимого. Например, в нашем примере выше, использующемString
объекты для представления цветов, цветные объекты плавают где-то в памяти. Два списка содержат указатели на объекты одного цвета. Вот схема.Первый список
colors
можно изменить. Это означает, что некоторые элементы могут быть удалены, как видно из кода выше, где мы удалили исходный третий элементChartreuse
(индекс 2 = порядковый номер 3). И элементы могут быть добавлены. И элементы могут быть изменены, чтобы указать на некоторые другие,String
такие какOliveDrab
илиCornflowerBlue
.Напротив, четыре элемента
masterColors
являются фиксированными. Без удаления, без добавления и без замены другого цвета. ЭтаList
реализация не поддается изменению.источник