Gegeven een array moeten we de elementen ervan in een andere array kopiëren, een naïeve gebruiker komt op de volgende manier in gedachten, die echter onjuist is, zoals hieronder als volgt weergegeven:
// Java Program to Illustrate Wrong Way Of Copying an Array // Input array int a[] = { 1, 8, 3 }; // Creating an array b[] of same size as a[] int b[] = new int[a.length]; // Doesn't copy elements of a[] to b[], only makes // b refer to same location b = a;>
Uitgang:
Uitvoer uitleg: Wanneer we b = a doen, wijzen we feitelijk een verwijzing naar de array toe. Als we dus enige wijziging in één array aanbrengen, zou dit ook in andere arrays worden weerspiegeld, omdat zowel a als b naar dezelfde locatie verwijzen. We kunnen het ook als volgt verifiëren met code zoals hieronder weergegeven:
Voorbeeld:
Java
// A Java program to demonstrate that simply> // assigning one array reference is incorrect> public> class> Test {> > public> static> void> main(String[] args)> > {> > int> a[] = {> 1> ,> 8> ,> 3> };> > > // Create an array b[] of same size as a[]> > int> b[] => new> int> [a.length];> > > // Doesn't copy elements of a[] to b[],> > // only makes b refer to same location> > b = a;> > > // Change to b[] will also reflect in a[]> > // as 'a' and 'b' refer to same location.> > b[> 0> ]++;> > > System.out.println(> 'Contents of a[] '> );> > for> (> int> i => 0> ; i System.out.print(a[i] + ' '); System.out.println('
Contents of b[] '); for (int i = 0; i System.out.print(b[i] + ' '); } }> |
>
>Uitvoer
Contents of a[] 2 8 3 Contents of b[] 2 8 3>
Methoden:
We hebben intern werk gezien bij het kopiëren van elementen en randgevallen waarmee rekening moet worden gehouden na het overwinnen van fouten zoals hierboven gegenereerd, dus nu kunnen we de juiste manieren voorstellen om de array te kopiëren, zoals hieronder vermeld:
- Elk element van de gegeven originele array herhalen en één element tegelijk kopiëren
- Met behulp van de clone()-methode
- Met behulp van de arraycopy()-methode
- Met behulp van de copyOf()-methode van de klasse Arrays
- Gebruik de methode copyOfRange() van de klasse Arrays
Methode 1: Elk element van de gegeven originele array herhalen en één element tegelijk kopiëren. Met het gebruik van deze methode garandeert het dat eventuele wijzigingen aan b de oorspronkelijke array a niet zullen veranderen, zoals in het onderstaande voorbeeld als volgt wordt weergegeven:
Voorbeeld:
Java
// Java program to demonstrate copying by> // one by one assigning elements between arrays> > // Main class> public> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Input array a[]> > int> a[] = {> 1> ,> 8> ,> 3> };> > > // Create an array b[] of same size as a[]> > int> b[] => new> int> [a.length];> > > // Copying elements of a[] to b[]> > for> (> int> i => 0> ; i b[i] = a[i]; // Changing b[] to verify that // b[] is different from a[] b[0]++; // Display message only System.out.println('Contents of a[] '); for (int i = 0; i System.out.print(a[i] + ' '); // Display message only System.out.println('
Contents of b[] '); for (int i = 0; i System.out.print(b[i] + ' '); } }> |
>
>Uitvoer
byte-array naar string
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
Methode 2: Met behulp van de Clone()-methode
Bij de vorige methode moesten we de hele array doorlopen om een kopie te maken. Kunnen we dat beter doen? Ja, we kunnen de kloonmethode in Java gebruiken.
Voorbeeld:
Java
// Java program to demonstrate Copying of Array> // using clone() method> > // Main class> public> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Input array a[]> > int> a[] = {> 1> ,> 8> ,> 3> };> > > // Copying elements of a[] to b[]> > int> b[] = a.clone();> > > // Changing b[] to verify that> > // b[] is different from a[]> > b[> 0> ]++;> > > // Display message for better readability> > System.out.println(> 'Contents of a[] '> );> > > for> (> int> i => 0> ; i System.out.print(a[i] + ' '); // Display message for better readability System.out.println('
Contents of b[] '); for (int i = 0; i System.out.print(b[i] + ' '); } }> |
>
>Uitvoer
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
Methode 3: Met behulp van de arraycopy()-methode
Wij kunnen ook gebruiken Systeem.arraycopy() Methode. Het systeem is aanwezig in het pakket java.lang. De handtekening is als:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)>
Parameters:
- src geeft de bronarray aan.
- srcPos is de index van waaruit het kopiëren begint.
- begin geeft de bestemmingsmatrix aan
- bestePos is de index van waaruit de gekopieerde elementen in de doelarray worden geplaatst.
- lengte is de lengte van de subarray die moet worden gekopieerd.
Voorbeeld:
Java
// Java program to demonstrate array> // copy using System.arraycopy()> > // Main class> public> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Custom input array> > int> a[] = {> 1> ,> 8> ,> 3> };> > > // Creating an array b[] of same size as a[]> > int> b[] => new> int> [a.length];> > > // Copying elements of a[] to b[]> > System.arraycopy(a,> 0> , b,> 0> ,> 3> );> > > // Changing b[] to verify that> > // b[] is different from a[]> > b[> 0> ]++;> > > // Display message only> > System.out.println(> 'Contents of a[] '> );> > > for> (> int> i => 0> ; i System.out.print(a[i] + ' '); // Display message only System.out.println('
Contents of b[] '); for (int i = 0; i System.out.print(b[i] + ' '); } }> |
>
>Uitvoer
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
Methode 4: Met behulp van de copyOf()-methode van de klasse Arrays
Als we de eerste paar elementen van een array of een volledige kopie van de array willen kopiëren, kun je deze methode gebruiken.
Syntaxis:
public static int[] copyOf?(int[] original, int newLength)>
Parameters:
- Originele array
- Lengte van de array die moet worden gekopieerd.
Voorbeeld:
Java
// Java program to demonstrate array> // copy using Arrays.copyOf()> > // Importing Arrays class from utility class> import> java.util.Arrays;> > // Main class> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Custom input array> > int> a[] = {> 1> ,> 8> ,> 3> };> > > // Create an array b[] of same size as a[]> > // Copy elements of a[] to b[]> > int> b[] = Arrays.copyOf(a,> 3> );> > > // Change b[] to verify that> > // b[] is different from a[]> > b[> 0> ]++;> > > System.out.println(> 'Contents of a[] '> );> > > // Iterating over array. a[]> > for> (> int> i => 0> ; i System.out.print(a[i] + ' '); System.out.println('
Contents of b[] '); // Iterating over array b[] for (int i = 0; i System.out.print(b[i] + ' '); } }> |
>
>Uitvoer
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
Methode 5: Gebruik de methode copyOfRange() van de klasse Arrays
Deze methode kopieert het opgegeven bereik van de opgegeven array naar een nieuwe array.
public static int[] copyOfRange?(int[] original, int from, int to)>
Parameters:
- Originele array waaruit een bereik moet worden gekopieerd
- Initiële index van het te kopiëren bereik
- Eindindex van het te kopiëren bereik, exclusief
Voorbeeld:
Java
// Java program to demonstrate array> // copy using Arrays.copyOfRange()> > // Importing Arrays class from utility package> import> java.util.Arrays;> > // Main class> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Custom input array> > int> a[] = {> 1> ,> 8> ,> 3> ,> 5> ,> 9> ,> 10> };> > > // Creating an array b[] and> > // copying elements of a[] to b[]> > int> b[] = Arrays.copyOfRange(a,> 2> ,> 6> );> > > // Changing b[] to verify that> > // b[] is different from a[]> > > // Iterating over array a[]> > System.out.println(> 'Contents of a[] '> );> > for> (> int> i => 0> ; i System.out.print(a[i] + ' '); // Iterating over array b[] System.out.println('
Contents of b[] '); for (int i = 0; i System.out.print(b[i] + ' '); } }> |
wat is bijenkorf
>
>Uitvoer
Contents of a[] 1 8 3 5 9 10 Contents of b[] 3 5 9 10>
Laten we tenslotte de overzicht van bovenstaande methoden:
- Het simpelweg toekennen van referenties is verkeerd
- De array kan worden gekopieerd door een array te herhalen en elementen één voor één toe te wijzen.
- We kunnen iteratie over elementen vermijden met kloon() of System.arraycopy()
- clone() maakt een nieuwe array van dezelfde grootte, maar Systeem.arraycopy() kan worden gebruikt om van een bronbereik naar een bestemmingsbereik te kopiëren.
- System.arraycopy() is sneller dan clone() omdat het Java Native Interface gebruikt
- Als u de eerste paar elementen van een array of een volledige kopie van een array wilt kopiëren, kunt u de methode Arrays.copyOf() gebruiken.
- Arrays.copyOfRange() wordt gebruikt om een opgegeven bereik van een array te kopiëren. Als de startindex niet 0 is, kunt u deze methode gebruiken om een gedeeltelijke array te kopiëren.