Deep Copy um Array em Java

Rupam Yadav 12 outubro 2023
  1. Deep Copy usando a função System.arraycopy() em Java
  2. Copie profundamente um array usando o comando Arrays.copyOf em Java
Deep Copy um Array em Java

Neste tutorial, discutimos como copiar profundamente um array em Java.

Geralmente, existem dois tipos de métodos de cópia de array em Java: o Shallow Copy e o Deep Copy. Na cópia superficial, os objetos são copiados. Por outro lado, todos os itens são copiados enquanto um array diferente é criado no Deep Copy.

Abaixo está um exemplo que mostra o que acontece quando copiamos um array em outro diretamente. Criamos um array arr1 com itens e então inicializamos outro arr2 com arr1. Quando qualquer elemento de arr2 é alterado, a mudança também é refletida em arr1.

import java.util.Arrays;

public class DeepCopy {
  public static void main(String[] args) {
    int[] arr1 = {10, 20, 30};
    System.out.println("arr1 Before copying: " + Arrays.toString(arr1));

    int[] arr2 = arr1;
    System.out.println("arr2 After copying: " + Arrays.toString(arr1));

    arr2[0] = 30;
    System.out.println(
        "arr1 after copying and changing an element in arr2: " + Arrays.toString(arr1));
  }
}

Resultado:

arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [30, 20, 30]

Deep Copy usando a função System.arraycopy() em Java

No exemplo a seguir, pegamos um array arr1 com alguns itens e, em seguida, pegamos outro array arr2 e atribuímos a ele o tamanho igual ao de arr1. Chamamos o método arrayCopy() da classe System que copia um array para outro.

A função arrayCopy() leva quatro argumentos; os dois primeiros são a matriz de origem e a posição inicial da cópia na matriz de origem. O terceiro argumento é o array de destino e sua posição inicial, onde copiaremos os elementos e o número de itens a serem copiados em um novo array.

Quando mudamos o item arr2, assim como no exemplo anterior, os elementos de arr1 não mudam nada.

import java.util.Arrays;

public class DeepCopy {
  public static void main(String[] args) {
    int[] arr1 = {10, 20, 30};
    System.out.println("arr1 Before copying: " + Arrays.toString(arr1));

    int[] arr2 = new int[arr1.length];

    System.arraycopy(arr1, 0, arr2, 0, arr1.length);
    System.out.println("arr2 After copying: " + Arrays.toString(arr1));

    arr2[0] = 30;
    System.out.println(
        "arr1 after copying and changing an element in arr2: " + Arrays.toString(arr1));
  }
}

Resultado:

arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [10, 20, 30]

Copie profundamente um array usando o comando Arrays.copyOf em Java

Abaixo, usamos o método copyOf() da classe de utilitário Arrays. Ele aceita a matriz a ser copiada e seu tamanho, em seguida, retorna a matriz do mesmo tipo. Fazemos um novo array arr2 usando este método e verificamos se a mudança de arr2 muda arr1 ou não. A saída mostra o resultado.

Observe que este método e o anterior criam uma cópia superficial em vez de uma cópia profunda quando o array contém objetos em vez de primitivos.

import java.util.Arrays;

public class DeepCopy {
  public static void main(String[] args) {
    int[] arr1 = {10, 20, 30};
    System.out.println("arr1 Before copying: " + Arrays.toString(arr1));

    int[] arr2 = Arrays.copyOf(arr1, arr1.length);
    System.out.println("arr2 After copying: " + Arrays.toString(arr1));

    arr2[0] = 30;
    System.out.println(
        "arr1 after copying and changing an element in arr2: " + Arrays.toString(arr1));
  }
}

Resultado:

arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [30, 20, 30]

Também podemos usar Arrays.copyOf() para copiar o array bidimensional. No exemplo abaixo, temos um array 2D arr. Temos um novo array arr2, e no loop, usamos Arrays.copyOf que pega todos os elementos de arr e os copia para o arr2 item por item. Uma vez copiado, verificamos se arr1 muda se arr2 é alterado. Se não mudar, é um array copiada em profundidade.

import java.util.Arrays;

public class DeepCopy {
  public static void main(String[] args) {
    int[][] arr = {{1, 2}, {3, 4}, {5, 6}};

    System.out.println("Values of arr");
    for (int i = 0; i < arr.length; i++)
      for (int j = 0; j < arr.length - 1; j++)
        System.out.println("arr[" + i + "][" + j + "] = " + arr[i][j]);

    System.out.println();

    int[][] arr2 = new int[arr.length][];
    for (int i = 0; i < arr.length; i++) {
      arr2[i] = Arrays.copyOf(arr[i], arr[i].length);
    }

    System.out.println("Values of arr2");

    for (int i = 0; i < arr2.length; i++)
      for (int j = 0; j < arr2.length - 1; j++)
        System.out.println("arr2[" + i + "][" + j + "] = " + arr2[i][j]);

    arr2[0][1] = 5;

    System.out.println();

    System.out.println("Values of arr after changing an element in arr2");
    for (int i = 0; i < arr.length; i++)
      for (int j = 0; j < arr.length - 1; j++)
        System.out.println("arr[" + i + "][" + j + "] = " + arr[i][j]);
  }
}

Resultado:

Values of arr
arr[0][0] = 1
arr[0][1] = 2
arr[1][0] = 3
arr[1][1] = 4
arr[2][0] = 5
arr[2][1] = 6

Values of arr2
arr2[0][0] = 1
arr2[0][1] = 2
arr2[1][0] = 3
arr2[1][1] = 4
arr2[2][0] = 5
arr2[2][1] = 6

Values of arr after changing an element in arr2
arr[0][0] = 1
arr[0][1] = 2
arr[1][0] = 3
arr[1][1] = 4
arr[2][0] = 5
arr[2][1] = 6
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn

Artigo relacionado - Java Array