Почему мои списки ссылок указывают на одно и то же после клона? - PullRequest
2 голосов
/ 26 сентября 2011

Я заметил, что когда у меня впервые есть

list2 = (LinkedList)list.clone();

Я мог бы работать с обоими списками независимо, например. list2.remove(1)

Но позже, когда я

list = (LinkedList)list2.clone();

когда я делаю list.remove(1) list2 тоже влияет. Почему это?

UPDATE

Мой код http://pastie.org/2598096

Пример ввода:

4 8
1 5 2 3
4
I 1 2
R 2
C 1 10
I 4 2

> javac Main.java && java Main < ./input/betterlist0.in 
[ 1, 5, 2, 3, ] -- [ 2, 1, 5, 2, 3, ] // list2 can be modified from list1 independently
YES9 8
[ 2, 5, 2, 3, ] -- [ 2, 5, 2, 3, ] // now when list2 is modified, list1 gets modified too. 

Я думаю, потому что super.clone() делает мелкую копию. Но почему тогда это сработало в первый раз?

Ответы [ 4 ]

3 голосов
/ 26 сентября 2011
LinkedList l1 = new LinkedList();
l1.add("A");l1.add("B");

LinkedList l2 = (LinkedList)l1.clone();
out("l2 after clone: "+l2.size());
l2.remove(0);
out("l2 after remove: "+l2.size());
l1 = (LinkedList)l2.clone();
out("l1 cloned from l2: "+l1.size());
l1.remove(0);
out("l1 after remove :"+l1.size());
out("l2 after l1's remove:"+l2.size());

, что означает:

l2 after clone: 2
l2 after remove: 1
l1 cloned from l2: 1
l1 after remove :0
l2 after l1's remove:1

, демонстрирующее

.clone

, работает как ожидалось.

3 голосов
/ 26 сентября 2011

Как правило, вы должны написать свою собственную функцию clone() для получения нужной глубокой копии.потому что Java не гарантирует этого.

Вот цитата из wikipedia :

Реализация Object.clone () по умолчанию выполняет поверхностное копирование.Когда классу требуется глубокая копия или какое-либо другое пользовательское поведение, он должен выполнить это в своем собственном методе clone () после получения копии от суперкласса.

И я думаю this тоже стоит прочитать.

0 голосов
/ 26 октября 2012

Вот также то, что может происходить.

По сути, список, вероятно, содержит не фактические данные объекта, а ссылки на них.Другими словами, он отслеживает указатели (или адреса памяти) на эти объекты.

В английском это похоже на высказывание «Эти дома находятся по этим адресам», и вы храните список адресов втелефонная книга.Возможно, клон () не копирует дом, но может копировать телефонную книгу

Также существует вероятность того, что кто-то может сохранить «Телефонную книгу на полке B», записав еевручение кому-то еще бумаги с надписью «Телефонная книга хранится на полке B»

0 голосов
/ 26 сентября 2011

когда я делаю list.remove (1), на list2 тоже влияют

Нет, это не так. Ваши наблюдения виноваты здесь.

...