Рубрики
Без рубрики

Глубокое копирование Java – Объект копирования Java

Глубокая копия Java, список копий java, объект копирования java, глубокая копия java против мелкой копии, глубокая копия java с использованием сериализации, пример кода массива копирования java.

Автор оригинала: Pankaj Kumar.

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

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

Одним из способов получения глубокой копии объекта является использование сериализации . Просто для того, чтобы пересмотреть, Сериализация в Java позволяет нам конвертировать объект в поток, который мы можем отправлять по сети или сохранять в виде файла или хранить в БД для последующего использования.

Давайте будем иметь это в виду и остановимся на основной идее глубокого копирования на Java.

Основная идея глубокого копирования на java заключается в следующем:

  1. Существует объект Java, который необходимо клонировать (глубоко).
  2. Первый шаг-пометить объект модели как Сериализуемый , чтобы объект можно было преобразовать в поток, чтобы его можно было записать в файл/поток и прочитать обратно.
  3. Когда объект считывается обратно, мы получаем глубокий клон исходного объекта.
  4. Обратите внимание, что этот метод отлично работает, когда класс, который вы хотите глубоко скопировать, сериализуем, и все его переменные также сериализуемы. В противном случае это не сработает, и вы получите java.io.NotSerializableException .
  5. Если классы не сериализуемы, то единственный вариант-написать пользовательский метод, который позаботится о копировании переменных объекта поле за полем, чтобы получить глубокую копию.

Как сделать глубокое копирование?

Теперь описан процесс, с помощью которого мы можем глубоко скопировать объект. Давайте посмотрим, как это делается программно:

/**
 * Makes a deep copy of any Java object that is passed.
 */
 private static Object deepCopy(Object object) {
   try {
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
     ObjectOutputStream outputStrm = new ObjectOutputStream(outputStream);
     outputStrm.writeObject(object);
     ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
     ObjectInputStream objInputStream = new ObjectInputStream(inputStream);
     return objInputStream.readObject();
   }
   catch (Exception e) {
     e.printStackTrace();
     return null;
   }
 }

Приведенный выше метод принимает объект и возвращает его глубокую копию.

Этот метод является готовым к использованию методом. Это можно назвать как:

//Student should be Serializable, primitive and Strings are Serilizable too.
Student john = new Student("John", 13, "23, 23rd Street, Goa");
Student abraham = (Student) deepCopy(john);

Глубокая копия против Мелкой копии

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

Важно понимать, что поверхностная копия-это всего лишь еще одна ссылка на тот же объект. Давайте посмотрим в коде, как можно сделать Неглубокую копию объекта:

List firstList, secondList;
firstList = new ArrayList();
firstList.add("Hello:);

secondList = firstList;
secondList.add("World");

В приведенном выше примере оператор второй список; создает неглубокую копию первого списка. Когда второй элемент добавляется во второй список, это также означает, что первый список также содержит два элемента, потому что оба списка на самом деле одинаковы .

Метод клонирования объекта()

Обычно считается, что метод клонирования объекта() создает копию целевого объекта.

Вот что говорит javadoc :

Обратите внимание, что это означает, что с одной стороны клон может быть целевым объектом, а с другой стороны клон может даже не соответствовать фактическому объекту. И это предполагает, что клон даже поддерживается.

Подводя итог, можно сказать, что клон может значительно отличаться для каждого класса Java.

Вывод

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