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