← Назад ко всем вопросам

Разница 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 важно для предотвращения непреднамеренных изменений данных и обеспечения правильного поведения программ.

Тема: Java Core
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки