Sobes.tech
Назад к вопросам
Junior — Middle
66

Объясните разницу между поверхностным и глубоким копированием объектов.

Компании, где спрашивали
Передовые Платежные Решения

Ответ от нейросети

sobes.tech AI

Поверхностное (shallow) и глубокое (deep) копирование объектов в Java отличаются тем, как копируются вложенные объекты:

  • Поверхностное копирование создает новый объект, но поля-ссылки внутри копируются как есть, то есть обе копии ссылаются на одни и те же вложенные объекты. Изменения вложенных объектов в одной копии будут видны и в другой.

  • Глубокое копирование создает новый объект и рекурсивно копирует все вложенные объекты, создавая полностью независимую копию со своей структурой.

В Java поверхностное копирование часто реализуется через метод clone(), который по умолчанию делает именно поверхностное копирование. Для глубокого копирования нужно самостоятельно реализовать копирование вложенных объектов.

Пример поверхностного копирования:

class Person implements Cloneable {
    String name;
    Address address; // Address - отдельный класс

    public Person clone() throws CloneNotSupportedException {
        return (Person) super.clone(); // поверхностное копирование
    }
}

Если изменить address в клоне, это повлияет на оригинал, так как ссылка одна и та же.

Для глубокого копирования нужно клонировать и вложенные объекты:

public Person deepClone() {
    Person cloned = this.clone();
    cloned.address = this.address.clone(); // предполагается, что Address тоже реализует clone
    return cloned;
}