Deep Copy um Array em Java
-
Deep Copy usando a função
System.arraycopy()em Java -
Copie profundamente um array usando o comando
Arrays.copyOfem 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 Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn