Рубрики

Глубокое, мелкое и ленивое копирование с примерами Java

В объектно-ориентированном программировании копирование объекта создает копию существующего объекта, результирующий объект называется копией объекта или просто копией исходного объекта. Существует несколько способов копирования объекта, чаще всего с помощью конструктора копирования или клонирования. ,

Мы можем определить клонирование как «создать копию объекта». Мелкая, глубокая и ленивая копия связана с процессом клонирования.
это на самом деле способы создания объекта копирования.

Мелкая копия

  • Всякий раз, когда мы используем реализацию метода клона по умолчанию, мы получаем поверхностную копию объекта, это означает, что он создает новый экземпляр и копирует все поле объекта в этот новый экземпляр и возвращает его как тип объекта, нам необходимо явно привести его обратно к нашему исходному объекту. Это мелкая копия объекта.
  • Метод clone () класса объекта поддерживает поверхностную копию объекта. Если объект содержит как примитивную, так и непримитивную переменную или переменную ссылочного типа в мелкой копии, клонированный объект также ссылается на тот же объект, на который ссылается исходный объект, поскольку копируются только ссылки на объекты, а не сами упомянутые объекты.
  • Вот почему название мелкой копии или неглубокое клонирование в Java. Если есть только поля примитивного типа или неизменяемые объекты, то нет разницы между мелкой и глубокой копией в Java.

// код, иллюстрирующий мелкую копию

public class Ex {

  

    private int[] data;

  

    // делает поверхностную копию значений

    public Ex(int[] values) {

        data = values;

    }

  

    public void showData() {

        System.out.println( Arrays.toString(data) );

    }

}

Приведенный выше код показывает мелкое копирование. Данные просто ссылаются на тот же массив, что и vals.

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

public class UsesEx{

  

    public static void main(String[] args) {

        int[] vals = {3, 7, 9};

        Ex e = new Ex(vals);

        e.showData(); // распечатывает [3, 7, 9]

        vals[0] = 13;

        e.showData(); // распечатывает [13, 7, 9]

  

        // Очень запутанно, потому что мы этого не сделали

        // намеренно изменить что-либо

        // объект, на который ссылается e

    }

}

Output 1 : [3, 7, 9]
Output 2 : [13, 7, 9]

Deep Copy

  • Всякий раз, когда нам нужна собственная копия, чтобы не использовать реализацию по умолчанию, мы называем ее глубокой копией, когда нам нужна глубокая копия объекта, которую мы должны реализовать в соответствии с нашими потребностями.
  • Поэтому для глубокого копирования нам нужно убедиться, что все классы-члены также реализуют интерфейс Cloneable и переопределить метод clone () класса объекта.

Глубокая копия означает на самом деле создание нового массива и копирование значений.

// Код, объясняющий глубокую копию

public class Ex {

      

    private int[] data;

  

    // изменено, чтобы сделать глубокую копию значений

    public Ex(int[] values) {

        data = new int[values.length];

        for (int i = 0; i < data.length; i++) {

            data[i] = values[i];

        }

    }

  

    public void showData() {

        System.out.println(Arrays.toString(data));

    }

}

public class UsesEx{

  

    public static void main(String[] args) {

        int[] vals = {3, 7, 9};

        Ex e = new Ex(vals);

        e.showData(); // распечатывает [3, 7, 9]

        vals[0] = 13;

        e.showData(); // распечатывает [3, 7, 9]

  

       // изменений в значениях массива не будет

       // показано в значениях данных.

    }

}

Output 1 : [3, 7, 9]
Output 2 : [3, 7, 9]

Изменения значений массива не приведут к изменениям данных массива.

когда использовать что
Не существует жесткого и быстрого правила, определенного для выбора между мелкой копией и глубокой копией, но обычно мы должны помнить, что если у объекта есть только примитивные поля, то, очевидно, мы должны пойти на мелкую копию, но если у объекта есть ссылки на другие объекты затем, в зависимости от требования, следует сделать мелкую или глубокую копию. Если ссылки не обновляются, то нет смысла инициировать глубокую копию.

Ленивый Копия
Ленивая копия может быть определена как комбинация как мелкой копии, так и глубокой копии. Механизм следует простому подходу — в начальном состоянии используется подход мелкого копирования. Счетчик также используется для отслеживания того, сколько объектов совместно используют данные. Когда программа хочет изменить исходный объект, она проверяет, является ли объект общим или нет. Если объект является общим, то запускается механизм глубокого копирования.

Резюме
При мелком копировании копируются только поля примитивного типа данных, а ссылки на объекты не копируются. Глубокая копия включает в себя копию примитивного типа данных, а также ссылки на объекты. Не существует жесткого и быстрого правила относительно того, когда делать мелкую копию, а когда делать глубокую копию. Ленивая копия — это комбинация обоих этих подходов.

Эта статья предоставлена Абхишеком Гуптой . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Глубокое, мелкое и ленивое копирование с примерами Java

0.00 (0%) 0 votes