Array Copy i Java

Array Copy i Java

Givet et array, er vi nødt til at kopiere dets elementer i et andet array, til en naiv bruger nedenfor kommer i tankerne, hvilket dog er forkert som afbildet nedenfor som følger:

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

Produktion:

Output forklaring: Når vi gør b = a, tildeler vi faktisk en reference til arrayet. Derfor, hvis vi foretager en ændring af et array, vil det også afspejles i andre arrays, fordi både a og b refererer til den samme placering. Vi kan også verificere det med kode som vist nedenfor som følger:

Eksempel:

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] + ' '); } }>

Produktion

Contents of a[] 2 8 3 Contents of b[] 2 8 3 

Metoder:

Vi har set internt arbejde under kopiering af elementer og kantsager, der skal tages i betragtning efter at have gennemgået fejl som genereret ovenfor, så nu kan vi foreslå korrekte måder at kopiere array på som angivet nedenfor som følger:

  1. Gentager hvert element i det givne originale array og kopierer ét element ad gangen
  2. Brug af clone() metode
  3. Bruger arraycopy() metoden
  4. Bruger metoden copyOf() i Arrays-klassen
  5. Bruger metoden copyOfRange() i Arrays-klassen

Metode 1: Gentager hvert element i det givne originale array og kopierer ét element ad gangen. Med brugen af ​​denne metode garanterer den, at enhver modifikation af b, ikke vil ændre den oprindelige matrix a, som vist i nedenstående eksempel som følger:

Eksempel:

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] + ' '); } }>

Produktion

Contents of a[] 1 8 3 Contents of b[] 2 8 3 

Metode 2: Brug af Clone() metoden

I den tidligere metode var vi nødt til at iterere over hele arrayet for at lave en kopi, kan vi gøre det bedre? Ja, vi kan bruge klonmetoden i Java.

Eksempel:

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] + ' '); } }>

Produktion

Contents of a[] 1 8 3 Contents of b[] 2 8 3 

Metode 3: Bruger arraycopy() metoden

Vi kan også bruge System.arraycopy() Metode. Systemet er til stede i java.lang-pakken. Dens signatur er som:

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 

Parametre:

  • src angiver kildearrayet.
  • srcPos er det indeks, hvorfra kopieringen starter.
  • Start angiver destinationsarrayet
  • destPos er det indeks, hvorfra de kopierede elementer placeres i destinationsarrayet.
  • længde er længden af ​​underarrayet, der skal kopieres.

Eksempel:

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] + ' '); } }>

Produktion

Contents of a[] 1 8 3 Contents of b[] 2 8 3 

Metode 4: Bruger metoden copyOf() i Arrays-klassen

Hvis vi ønsker at kopiere de første par elementer af et array eller en fuld kopi af arrayet, kan du bruge denne metode.

Syntaks:

public static int[] copyOf?(int[] original, int newLength) 

Parametre:

  • Originalt array
  • Længde på arrayet, der skal kopieres.

Eksempel:

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] + ' '); } }>

Produktion

Contents of a[] 1 8 3 Contents of b[] 2 8 3 

Metode 5: Bruger metoden copyOfRange() i Arrays-klassen

Denne metode kopierer det angivne område for det angivne array til et nyt array.

public static int[] copyOfRange?(int[] original, int from, int to) 

Parametre:

  • Originalt array, hvorfra et område skal kopieres
  • Indledende indeks for det område, der skal kopieres
  • Endeligt indeks for det område, der skal kopieres, eksklusivt

Eksempel:

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] + ' '); } }>

Produktion

Contents of a[] 1 8 3 5 9 10 Contents of b[] 3 5 9 10 

Lad os endelig diskutere oversigt over ovenstående metoder:

  • Det er forkert blot at tildele referencer
  • Arrayet kan kopieres ved at iterere over et array og et efter et tildele elementer.
  • Vi kan undgå iteration over elementer ved hjælp af clone() eller System.arraycopy()
  • clone() opretter et nyt array af samme størrelse, men System.arraycopy() kan bruges til at kopiere fra et kildeområde til et destinationsområde.
  • System.arraycopy() er hurtigere end clone(), da den bruger Java Native Interface
  • Hvis du vil kopiere de første par elementer af et array eller en fuld kopi af et array, kan du bruge Arrays.copyOf() metoden.
  • Arrays.copyOfRange() bruges til at kopiere et specificeret område af et array. Hvis startindekset ikke er 0, kan du bruge denne metode til at kopiere et delvist array.