Java Copy Arrays (met behulp van System arraycopy (), Looping-constructie enzovoort)

In deze tutorial leer je met behulp van voorbeelden over verschillende manieren waarop je arrays (zowel eendimensionaal als tweedimensionaal) in Java kunt kopiëren.

In Java kunnen we de ene array naar de andere kopiëren. Er zijn verschillende technieken die u kunt gebruiken om arrays in Java te kopiëren.

1. Arrays kopiëren met de toewijzingsoperator

Laten we een voorbeeld nemen,

 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 + ", "); ) ) )

Uitgang :

 1, 2, 3, 4, 5, 6

In het bovenstaande voorbeeld hebben we de toewijzingsoperator ( =) gebruikt om een ​​array met de naam numbers te kopiëren naar een andere array met de naam positiveNumbers.

Deze techniek is de gemakkelijkste en werkt ook. Er is echter een probleem met deze techniek. Als we elementen van een array wijzigen, veranderen ook de overeenkomstige elementen van de andere arrays. Bijvoorbeeld,

 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 + ", "); ) ) )

Uitgang :

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

Hier kunnen we zien dat we een waarde van de getallenreeks hebben gewijzigd. Als we de array positiveNumbers afdrukken, kunnen we zien dat dezelfde waarde ook is gewijzigd.

Het komt doordat beide arrays naar hetzelfde array-object verwijzen. Dit komt door de ondiepe kopie. Ga naar ondiepe kopie voor meer informatie over ondiep kopiëren.

Om nieuwe array-objecten te maken tijdens het kopiëren van de arrays, hebben we een diepe kopie nodig in plaats van een oppervlakkige kopie.

2. Looping Construct gebruiken om arrays te kopiëren

Laten we een voorbeeld nemen:

 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)); ) )

Uitgang :

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

In het bovenstaande voorbeeld hebben we de forlus gebruikt om elk element van de bronarray te doorlopen. In elke iteratie kopiëren we elementen van de bronarray naar de bestemmingsarray.

Hier verwijzen de bron- en bestemmingsarray naar verschillende objecten (diepe kopie). Dus als elementen van een array worden gewijzigd, blijven de overeenkomstige elementen van een andere array ongewijzigd.

Let op de verklaring,

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

Hier wordt de methode toString () gebruikt om een ​​array in een string te converteren. Ga voor meer informatie naar de methode toString () (officiële Java-documentatie).

3. Arrays kopiëren met de methode arraycopy ()

In Java bevat de klasse System een ​​methode met de naam arraycopy()om arrays te kopiëren. Deze methode is een betere benadering om arrays te kopiëren dan de bovenstaande twee.

Met deze arraycopy()methode kunt u een gespecificeerd gedeelte van de bronarray naar de doelarray kopiëren. Bijvoorbeeld,

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

Hier,

  • src - source-array die u wilt kopiëren
  • srcPos - startpositie (index) in de bronarray
  • dest - bestemmingsarray waar elementen uit de bron worden gekopieerd
  • destPos - startpositie (index) in de doelmatrix
  • lengte - aantal elementen om te kopiëren

Laten we een voorbeeld nemen:

 // 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)); ) )

Uitgang :

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

In het bovenstaande voorbeeld hebben we de arraycopy()methode gebruikt,

  • System.arraycopy(n1, 0, n2, 0, n1.length) - volledige elementen van de n1-array worden gekopieerd naar de n2-array
  • System.arraycopy(n1, 2, n3, 1, 2) - 2 elementen van de n1-array beginnend bij index 2 worden gekopieerd naar de index beginnend bij 1 van de n3-array

Zoals je kunt zien, is de standaard beginwaarde van elementen van een int-type array 0.

4. Arrays kopiëren met de methode copyOfRange ()

We kunnen ook de methode copyOfRange () gebruiken die is gedefinieerd in de klasse Java Arrays om arrays te kopiëren. Bijvoorbeeld,

 // 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)); ) )

Uitvoer

 bestemming1 = (2, 3, 12, 4, 12, -2) bestemming2 = (12, 4, 12)

Let in het bovenstaande voorbeeld op de regel,

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

Hier kunnen we zien dat we de array destination1 aan het maken zijn en tegelijkertijd de source-array ernaar kopiëren. We maken de array destination1 niet voordat we de copyOfRange()methode aanroepen . Bezoek Java copyOfRange voor meer informatie over de methode.

5. 2d-arrays kopiëren met Loop

Net als bij de eendimensionale array, kunnen we ook de 2-dimensionale array kopiëren met behulp van de forlus. Bijvoorbeeld,

 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)); ) )

Uitgang :

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

Let in het bovenstaande programma op de regel,

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

Hier wordt de deepToString()methode gebruikt om een ​​betere weergave van de 2-dimensionale array te geven. Bezoek Java deepToString () voor meer informatie.

2D-arrays kopiëren met arraycopy ()

Om de bovenstaande code eenvoudiger te maken, kunnen we de binnenste lus vervangen door System.arraycopy()zoals in het geval van een eendimensionale array. Bijvoorbeeld,

 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)); ) )

Uitgang :

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

Hier kunnen we zien dat we dezelfde uitvoer krijgen door de binnenste forlus te vervangen door de arraycopy()methode.

Interessante artikelen...