Java Copy Arrays (usando System arraycopy (), construção de Looping e assim por diante)

Neste tutorial, você aprenderá sobre as diferentes maneiras de copiar arrays (unidimensionais e bidimensionais) em Java com a ajuda de exemplos.

Em Java, podemos copiar um array para outro. Existem várias técnicas que você pode usar para copiar arrays em Java.

1. Copiando matrizes usando o operador de atribuição

Vamos dar um exemplo,

 class Main ( public static void main(String() args) ( int () numbers = (1, 2, 3, 4, 5, 6); int () positiveNumbers = numbers; // copying arrays for (int number: positiveNumbers) ( System.out.print(number + ", "); ) ) )

Produto :

 1, 2, 3, 4, 5, 6

No exemplo acima, usamos o operador de atribuição ( =) para copiar um array denominado numbers para outro array denominado PositiveNumbers.

Essa técnica é a mais fácil e funciona bem. No entanto, há um problema com essa técnica. Se mudarmos os elementos de um array, os elementos correspondentes dos outros arrays também mudam. Por exemplo,

 class Main ( public static void main(String() args) ( int () numbers = (1, 2, 3, 4, 5, 6); int () positiveNumbers = numbers; // copying arrays // change value of first array numbers(0) = -1; // printing the second array for (int number: positiveNumbers) ( System.out.print(number + ", "); ) ) )

Produto :

 -1, 2, 3, 4, 5, 6

Aqui, podemos ver que alteramos um valor da matriz de números. Quando imprimimos o array PositiveNumbers, podemos ver que o mesmo valor também é alterado.

É porque os dois arrays se referem ao mesmo objeto de array. Isso ocorre por causa da cópia superficial. Para saber mais sobre a cópia superficial, visite cópia superficial.

Agora, para fazer novos objetos de array enquanto copia os arrays, precisamos de uma cópia profunda em vez de uma cópia superficial.

2. Usando a construção de loop para copiar matrizes

Vamos dar um exemplo:

 import java.util.Arrays; class Main ( public static void main(String() args) ( int () source = (1, 2, 3, 4, 5, 6); int () destination = new int(6); // iterate and copy elements from source to destination for (int i = 0; i < source.length; ++i) ( destination(i) = source(i); ) // converting array to string System.out.println(Arrays.toString(destination)); ) )

Produto :

 (1, 2, 3, 4, 5, 6)

No exemplo acima, usamos o forloop para iterar por cada elemento da matriz de origem. Em cada iteração, estamos copiando elementos do array de origem para o array de destino.

Aqui, a matriz de origem e destino se refere a objetos diferentes (cópia profunda). Portanto, se os elementos de uma matriz forem alterados, os elementos correspondentes de outra matriz permanecerão inalterados.

Observe a declaração,

 System.out.println(Arrays.toString(destination));

Aqui, o método toString () é usado para converter um array em uma string. Para saber mais, visite o método toString () (documentação oficial do Java).

3. Copiar matrizes usando o método arraycopy ()

Em Java, a classe System contém um método denominado arraycopy()para copiar matrizes. Este método é uma abordagem melhor para copiar matrizes do que os dois anteriores.

O arraycopy()método permite que você copie uma parte especificada da matriz de origem para a matriz de destino. Por exemplo,

 arraycopy(Object src, int srcPos,Object dest, int destPos, int length)

Aqui,

  • src - array de origem que você deseja copiar
  • srcPos - posição inicial (índice) na matriz de origem
  • dest - array de destino onde os elementos serão copiados da fonte
  • destPos - posição inicial (índice) na matriz de destino
  • comprimento - número de elementos a serem copiados

Vamos dar um exemplo:

 // To use Arrays.toString() method import java.util.Arrays; class Main ( public static void main(String() args) ( int() n1 = (2, 3, 12, 4, 12, -2); int() n3 = new int(5); // Creating n2 array of having length of n1 array int() n2 = new int(n1.length); // copying entire n1 array to n2 System.arraycopy(n1, 0, n2, 0, n1.length); System.out.println("n2 = " + Arrays.toString(n2)); // copying elements from index 2 on n1 array // copying element to index 1 of n3 array // 2 elements will be copied System.arraycopy(n1, 2, n3, 1, 2); System.out.println("n3 = " + Arrays.toString(n3)); ) )

Produto :

 n2 = (2, 3, 12, 4, 12, -2) n3 = (0, 12, 4, 0, 0)

No exemplo acima, usamos o arraycopy()método,

  • System.arraycopy(n1, 0, n2, 0, n1.length) - elementos inteiros da matriz n1 são copiados para a matriz n2
  • System.arraycopy(n1, 2, n3, 1, 2) - 2 elementos da matriz n1 a partir do índice 2 são copiados para o índice a partir de 1 da matriz n3

Como você pode ver, o valor inicial padrão dos elementos de uma matriz do tipo int é 0.

4. Copiando matrizes usando o método copyOfRange ()

Também podemos usar o método copyOfRange () definido na classe Java Arrays para copiar arrays. Por exemplo,

 // To use toString() and copyOfRange() method import java.util.Arrays; class ArraysCopy ( public static void main(String() args) ( int() source = (2, 3, 12, 4, 12, -2); // copying entire source array to destination int() destination1 = Arrays.copyOfRange(source, 0, source.length); System.out.println("destination1 = " + Arrays.toString(destination1)); // copying from index 2 to 5 (5 is not included) int() destination2 = Arrays.copyOfRange(source, 2, 5); System.out.println("destination2 = " + Arrays.toString(destination2)); ) )

Resultado

 destino 1 = (2, 3, 12, 4, 12, -2) destino 2 = (12, 4, 12)

No exemplo acima, observe a linha,

 int() destination1 = Arrays.copyOfRange(source, 0, source.length);

Aqui, podemos ver que estamos criando a matriz destination1 e copiando a matriz de origem para ele ao mesmo tempo. Não estamos criando o array destination1 antes de chamar o copyOfRange()método. Para saber mais sobre o método, visite Java copyOfRange.

5. Copiando Arrays 2D usando Loop

Semelhante ao array unidimensional, também podemos copiar o array bidimensional usando o forloop. Por exemplo,

 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) ( // allocating space for each row of destination array destination(i) = new int(source(i).length); for (int j = 0; j < destination(i).length; ++j) ( destination(i)(j) = source(i)(j); ) ) // displaying destination array System.out.println(Arrays.deepToString(destination)); ) )

Produto :

 ((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))

No programa acima, observe a linha,

 System.out.println(Arrays.deepToString(destination);

Aqui, o deepToString()método é usado para fornecer uma representação melhor da matriz bidimensional. Para saber mais, visite Java deepToString ().

Copiar matrizes 2d usando arraycopy ()

Para tornar o código acima mais simples, podemos substituir o loop interno por System.arraycopy()como no caso de uma matriz unidimensional. Por exemplo,

 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) ( // allocating space for each row of destination array destination(i) = new int(source(i).length); System.arraycopy(source(i), 0, destination(i), 0, destination(i).length); ) // displaying destination array System.out.println(Arrays.deepToString(destination)); ) )

Produto :

 ((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))

Aqui, podemos ver que obtemos a mesma saída substituindo o forloop interno pelo arraycopy()método.

Artigos interessantes...