Deep Copy ArrayList em Java

Rashmi Patidar 15 fevereiro 2024
Deep Copy ArrayList em Java

Na linguagem Java, se quisermos copiar uma ArrayList, pode haver duas maneiras de fazer isso. Faça uma cópia profunda ou uma cópia superficial.

Na cópia profunda, um objeto completamente novo é criado e, portanto, a variação no estado do objeto antigo não refletirá nenhuma alteração na instância recém-criada.

Na cópia superficial, criamos um novo objeto que possui referências ao objeto existente. Portanto, qualquer mudança no estado do objeto antigo refletirá na instância recém-criada.

O diagrama que melhor ilustra as duas definições acima:

Cópia profunda vs rasa

O que é Deep Copy

A criação de um novo objeto a partir de um existente é chamada de cópia profunda. Este tipo de cópia não possui nenhuma referência ao objeto presente. Uma cópia profunda é uma tarefa iterativa. Ele copia recursivamente as variáveis ​​de membro interno e objetos para a nova instância.

Esse tipo de clone copia todos os objetos aninhados e não deixa nenhum link de referência entre a origem e a cópia. Esta clonagem copia exatamente todos os tipos de dados primitivos (byte, short, int) e não primitivos (String, Array, Class).

Se quisermos copiar um objeto em profundidade, substitua o método clone() da interface clonável da classe Object.

Aqui está o exemplo de código de cópia profunda de um ArrayList em Java:

package deepVsShallowCopy;

public class Car implements Cloneable {
  String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Car(String name) {
    this.name = name;
  }

  @Override
  public Car clone() throws CloneNotSupportedException {
    Car newCar = (Car) super.clone();
    newCar.setName(newCar.getName());
    return newCar;
  }
}

Na classe POJO acima, deve-se substituir o método clone, junto com getters e setters. O método clone() lança CloneNotSupportedException que devemos lançar no método sobrescrito.

Devemos implementar nossa versão para fazer um clone do objeto existente. Temos que copiar todas as variáveis ​​de membro da classe Car em uma nova instância.

Abaixo está a implementação da classe de driver para uma cópia profunda de um ArrayList:

package deepVsShallowCopy;

import java.util.ArrayList;
import java.util.List;

public class DeepCopyArrayList {
  public static void main(String[] args) throws CloneNotSupportedException {
    // instantiate car instance
    Car oldCar = new Car("Ambassador");
    // instantiate an arraylist
    List<Car> oldList = new ArrayList<Car>();
    // add oldCar object into the list
    oldList.add(oldCar);

    // instantiate newList
    List<Car> newList = new ArrayList<Car>();
    // add object created using clone() into list
    newList.add(oldList.get(0).clone());
    // rename field in newList car element
    newList.get(0).setName("Rolls Royce");

    System.out.println("oldName : " + oldList.get(0).getName()); // oldName : Ambassador
    System.out.println("newName : " + newList.get(0).getName()); // newName : Rolls Royce
  }
}

Na implementação acima, o método clone() sobrescrito da classe Car é chamado, o que retornará uma instância completamente nova. E essa instância recém-criada deve ser adicionada à ArrayList.

E quando fazemos algumas manipulações no objeto recém-criado, isso não afetará a referência do objeto antigo.

Além disso, se quisermos iterar em um ArrayList individualmente, o método clone() deve ser chamado sobre o objeto Car.

for (Car c : oldList) {
  newList.add(c.clone());
}
Rashmi Patidar avatar Rashmi Patidar avatar

Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.

LinkedIn

Artigo relacionado - Java ArrayList