Копия Java ArrayList

У меня есть 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 объектов списка, и сделать копию в коллекциях от старого до нового?

Ответ 1

Да, присваивание просто скопирует значение l1 (которое является ссылкой) на l2. Они будут ссылаться на один и тот же объект.

Создание мелкой копии довольно легко:

List<Integer> newList = new ArrayList<>(oldList);

(Как один пример.)

Ответ 3

Да 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 элемента.

Ответ 4

Другим удобным способом копирования значений из 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);

Это фактическое копирование значений, а не просто копирование ссылки.

Ответ 5

Java не передает объекты, передает ссылки (указатели) на объекты. Итак, да, l2 и l1 - два указателя на один и тот же объект.

Вам нужно сделать явную копию, если вам нужен два разных списка с тем же содержимым.

Ответ 6

Существует метод addAll(), который будет использоваться для копирования One ArrayList в другой.

Например, у вас есть два списка массивов: sourceList и targetList, используйте ниже код.

targetList.addAll(SOURCELIST);