Метод клонирования в списках в Java - это мелкое копирование или глубокое копирование?
Как я понимаю, когда я использую метод клонирования, указанный для List, или если я использую конструктор копирования для списка, мне нужно получить поверхностную копию списка:
ArrayList<String> a = new ArrayList<>();
a.add(new String("dog"));
a.add(new String("cat"));
ArrayList<String> b = new ArrayList<String>(a);
//ArrayList<String> b = (ArrayList<String>)a.clone();
b.remove(0);
Iterator<String> iter = a.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
Iterator<String> iter2 = b.iterator();
while(iter2.hasNext()){
System.out.println(iter2.next());
}
out put:
dog
cat
cat
Если b мелкая копия a, то почему при удалении элемента из b он не удаляется из a?
1 ответ
Так как b
это отдельный список, который был создан путем копирования элементов в a
,
Тот факт, что это мелкая копия, означает, что предметы внутри a
не клонируются; они относятся к одним и тем же объектам. Глубокая копия будет означать, что и список, и элементы внутри списка будут клонированы. Однако в обоих случаях сам список клонируется, поэтому теперь это два разных объекта.