Разница shallow и deep copy
1️⃣ Как кратко ответить
Shallow copy создает новый объект, но копирует только ссылки на вложенные объекты, а не сами объекты. Deep copy создает новый объект и рекурсивно копирует все вложенные объекты, создавая полную независимую копию.
2️⃣ Подробное объяснение темы
Когда мы говорим о копировании объектов в программировании, мы имеем в виду создание нового объекта, который является дубликатом существующего. В Java, как и в других языках программирования, существует два основных способа копирования объектов: shallow copy (поверхностное копирование) и deep copy (глубокое копирование).
Shallow Copy (Поверхностное копирование)
Shallow copy создает новый объект, но не копирует вложенные объекты. Вместо этого, он копирует ссылки на вложенные объекты. Это означает, что изменения в вложенных объектах будут отражаться как в оригинале, так и в копии, поскольку они ссылаются на одни и те же объекты в памяти.
Пример кода:
import java.util.ArrayList;
class ShallowCopyExample {
public static void main(String[] args) {
// Создаем оригинальный объект с вложенным списком
ArrayList<String> originalList = new ArrayList<>();
originalList.add("Item1");
originalList.add("Item2");
// Создаем поверхностную копию оригинального объекта
ArrayList<String> shallowCopyList = (ArrayList<String>) originalList.clone();
// Изменяем элемент в оригинальном списке
originalList.set(0, "NewItem");
// Печатаем оба списка
System.out.println("Original List: " + originalList);
System.out.println("Shallow Copy List: " + shallowCopyList);
}
}
originalList— это оригинальный объект, содержащий список строк.shallowCopyList— это поверхностная копияoriginalList.- Изменение элемента в
originalListтакже отразится вshallowCopyList, потому что оба списка содержат ссылки на одни и те же объекты.
Deep Copy (Глубокое копирование)
Deep copy создает новый объект и рекурсивно копирует все вложенные объекты. Это означает, что изменения в оригинальном объекте или его вложенных объектах не повлияют на копию, и наоборот. Deep copy обеспечивает полную независимость между оригиналом и копией.
Пример кода:
import java.util.ArrayList;
class DeepCopyExample {
public static void main(String[] args) {
// Создаем оригинальный объект с вложенным списком
ArrayList<String> originalList = new ArrayList<>();
originalList.add("Item1");
originalList.add("Item2");
// Создаем глубокую копию оригинального объекта
ArrayList<String> deepCopyList = new ArrayList<>();
for (String item : originalList) {
deepCopyList.add(new String(item));
}
// Изменяем элемент в оригинальном списке
originalList.set(0, "NewItem");
// Печатаем оба списка
System.out.println("Original List: " + originalList);
System.out.println("Deep Copy List: " + deepCopyList);
}
}
originalList— это оригинальный объект, содержащий список строк.deepCopyList— это глубокая копияoriginalList.- Каждый элемент из
originalListкопируется вdeepCopyListкак новый объект. - Изменение элемента в
originalListне влияет наdeepCopyList, так как они содержат независимые объекты.
Зачем это нужно?
- Shallow Copy: Быстрее и проще в реализации, подходит для объектов, где вложенные объекты не изменяются или не требуют независимости.
- Deep Copy: Необходима, когда требуется полная независимость между оригиналом и копией, особенно если вложенные объекты могут изменяться.
Понимание разницы между shallow и deep copy важно для предотвращения непреднамеренных изменений данных и обеспечения правильного поведения программ.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться