Ответ 1
Да, присваивание просто скопирует значение l1
(которое является ссылкой) на l2
. Они будут ссылаться на один и тот же объект.
Создание мелкой копии довольно легко:
List<Integer> newList = new ArrayList<>(oldList);
(Как один пример.)
У меня есть 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 объектов списка, и сделать копию в коллекциях от старого до нового?
Да, присваивание просто скопирует значение l1
(которое является ссылкой) на l2
. Они будут ссылаться на один и тот же объект.
Создание мелкой копии довольно легко:
List<Integer> newList = new ArrayList<>(oldList);
(Как один пример.)
Попробуйте использовать Collections.copy(destination, source);
Да l1
и l2
будет указывать на одну и ту же ссылку, тот же объект.
Если вы хотите создать новый ArrayList на основе другого ArrayList, вы сделаете следующее:
List<String> l1 = new ArrayList<String>();
l1.add("Hello");
l1.add("World");
List<String> l2 = new ArrayList<String>(l1); //A new arrayList.
l2.add("Everybody");
Результат будет l1
по-прежнему будет содержать 2 элемента, а l2
будет иметь 3 элемента.
Другим удобным способом копирования значений из src ArrayList в dest Arraylist является следующее:
ArrayList<String> src = new ArrayList<String>();
src.add("test string1");
src.add("test string2");
ArrayList<String> dest= new ArrayList<String>();
dest.addAll(src);
Это фактическое копирование значений, а не просто копирование ссылки.
Java не передает объекты, передает ссылки (указатели) на объекты. Итак, да, l2 и l1 - два указателя на один и тот же объект.
Вам нужно сделать явную копию, если вам нужен два разных списка с тем же содержимым.
Существует метод addAll(), который будет использоваться для копирования One ArrayList в другой.
Например, у вас есть два списка массивов: sourceList и targetList, используйте ниже код.
targetList.addAll(SOURCELIST);