2013-08-28 3 views
1

Предположим, у меня есть следующая структура, и я создал список, подобный этому. Если я сделаю temp.remove(0), это не повлияет на исходный список, но temp.get(0).vars.remove(0) также удалит элементы из исходного списка.создать список из другого списка и удалить элементы из скопированного списка

Я думаю, что new ArrayList(top.mids) не делает глубокую копию, то почему именно temp.remove(0) не влияет на исходный список?

//Top class init part and adding elements are omitted 
List<Mid> temp = new ArrayList(top.mids); 
temp.remove(0); 
temp.get(0).bots.remove(0); 


public class Top{ 
    List<Mid> mids = new ArrayList<Mid>(); 
} 

public class Mid{ 
    List<Bot> bots = new ArrayList<Bot>(); 

} 

public class Bot{ 
    int id; 
} 
+0

'новые ArrayList (top.mids)' копирует все в 'top.mids' на новый' ArrayList'. Удаление из этого списка не означает удаление из 'top.mids'. Если вы хотите изменить элементы в списке, эти изменения отразятся в 'top.mids', потому что они ссылаются на одни и те же объекты. –

ответ

4

Да, ваше понимание верное. List newList = new ArrayList(collection); сделает мелкую копию. Вы можете изменить newList, не затрагивая оригинал collection, но каждый из них будет ссылаться на одни и те же элементы, поэтому, если вы измените элемент в одном списке, элемент другого списка также получит изменение.

Это называется Мелкая копия. Вот визуальное представление о том, что я описал:

enter image description here

Вещи, в нижней части находятся объекты в массиве.

1

Заявление

новый ArrayList (top.mids) не делает глубокую копию

ссылается на тот факт, что в то время как вы на самом деле есть новый список, содержащий все пункты старого список, элементы в новом списке относятся к тем же экземплярам в памяти, что и старый список.

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

Чтобы сделать это ясно, что я хотел бы пойти с примером:

List<X> oldList = Arrays.asList(new X("1"), new X("2")); 
List<X> newList = new ArrayList<X>(oldList); 

newList.remove(0); 
System.out.println(newList.size()); // Prints 1 
System.out.println(oldList.size()); // Prints 2 

System.out.println(oldList.get(1).getValue()); // Prints 2 
newList.get(0).setValue("3"); 
System.out.println(oldList.get(1).getValue()); // Prints 3