Técnicas de Cópia de Arrays em Java: Guia Completo
Técnicas de Cópia de Arrays em Java
Aprenda como duplicar arrays unidimensionais e bidimensionais em Java usando operador de atribuição, loops, System.arraycopy, Arrays.copyOfRange e mais, com exemplos claros e dicas de boas práticas.
1. Cópia com Operador de Atribuição
Atribuir uma variável de array a outra é o método mais simples. Ele copia a referência, não os dados.
class Main {
public static void main(String[] args) {
int [] numbers = {1, 2, 3, 4, 5, 6};
int [] positiveNumbers = numbers; // cópia de referência
for (int number: positiveNumbers) {
System.out.print(number + ", ");
}
}
}
Saída:
1, 2, 3, 4, 5, 6
Ambos numbers e positiveNumbers agora apontam para o mesmo objeto array. Alterar um elemento afeta o outro:
class Main {
public static void main(String[] args) {
int [] numbers = {1, 2, 3, 4, 5, 6};
int [] positiveNumbers = numbers;
numbers[0] = -1;
for (int number: positiveNumbers) {
System.out.print(number + ", ");
}
}
}
Saída:
-1, 2, 3, 4, 5, 6
Esta é uma cópia rasa. Para evitar efeitos colaterais não intencionais, use uma técnica de cópia profunda.
2. Cópia Profunda com Loop
Iterar sobre cada elemento e atribuí-lo a um novo array cria uma cópia independente.
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int [] source = {1, 2, 3, 4, 5, 6};
int [] destination = new int[source.length];
for (int i = 0; i < source.length; ++i) {
destination[i] = source[i];
}
System.out.println(Arrays.toString(destination));
}
}
Saída:
[1, 2, 3, 4, 5, 6]
Como source e destination são objetos distintos, modificações em um não afetam o outro.
3. Usando System.arraycopy()
O método System.arraycopy do Java oferece uma maneira rápida e integrada de copiar segmentos de array.
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
src– array de origemsrcPos– índice inicial na origemdest– array de destinodestPos– índice inicial no destinolength– número de elementos a copiar
Exemplo:
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int[] n1 = {2, 3, 12, 4, 12, -2};
int[] n2 = new int[n1.length];
System.arraycopy(n1, 0, n2, 0, n1.length);
System.out.println("n2 = " + Arrays.toString(n2));
int[] n3 = new int[5];
System.arraycopy(n1, 2, n3, 1, 2);
System.out.println("n3 = " + Arrays.toString(n3));
}
}
Saída:
n2 = [2, 3, 12, 4, 12, -2] n3 = [0, 12, 4, 0, 0]
4. Cópia com Arrays.copyOfRange()
Quando você precisa de um novo array contendo uma fatia específica, Arrays.copyOfRange é ideal.
import java.util.Arrays;
class ArraysCopy {
public static void main(String[] args) {
int[] source = {2, 3, 12, 4, 12, -2};
int[] destination1 = Arrays.copyOfRange(source, 0, source.length);
System.out.println("destination1 = " + Arrays.toString(destination1));
int[] destination2 = Arrays.copyOfRange(source, 2, 5);
System.out.println("destination2 = " + Arrays.toString(destination2));
}
}
Saída:
destination1 = [2, 3, 12, 4, 12, -2] destination2 = [12, 4, 12]
5. Copiando Arrays 2D com Loop
Cópia profunda de um array bidimensional requer copiar cada linha individualmente.
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int[][] source = {
{1, 2, 3, 4},
{5, 6},
{0, 2, 42, -4, 5}
};
int[][] destination = new int[source.length][];
for (int i = 0; i < destination.length; ++i) {
destination[i] = new int[source[i].length];
for (int j = 0; j < destination[i].length; ++j) {
destination[i][j] = source[i][j];
}
}
System.out.println(Arrays.deepToString(destination));
}
}
Saída:
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
6. Cópia de Array 2D com System.arraycopy()
Substitua o loop interno com arraycopy para código mais limpo.
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int[][] source = {
{1, 2, 3, 4},
{5, 6},
{0, 2, 42, -4, 5}
};
int[][] destination = new int[source.length][];
for (int i = 0; i < source.length; ++i) {
destination[i] = new int[source[i].length];
System.arraycopy(source[i], 0, destination[i], 0, destination[i].length);
}
System.out.println(Arrays.deepToString(destination));
}
}
Saída:
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
Java
- Dominando Arrays em C#: Declaração, Inicialização e Operações
- Dominando Operadores Java: Tipos, Sintaxe e Exemplos Práticos
- Comentários em Java: Tipos, Uso e Boas Práticas
- Dominando Interfaces em Java: Conceitos, Implementação e Boas Práticas
- Dominando Try-With-Resources em Java: Gerenciamento Automático de Recursos Explicado
- Anotações em Java Explicadas: Tipos, Posicionamento e Exemplos Práticos
- Arrays em C++ Desmistificados: Declaração, Inicialização e Técnicas com Ponteiros
- Dominando Alocação Dinâmica de Arrays em C++: Guia Prático com Exemplos de Código
- Tutorial de Arrays em Java: Declaração, Criação e Inicialização – Código de Exemplo
- Criando Array de Objetos em Java: Guia Passo a Passo