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:
- Gentager hvert element i det givne originale array og kopierer ét element ad gangen
- Brug af clone() metode
- Bruger arraycopy() metoden
- Bruger metoden copyOf() i Arrays-klassen
- 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
ordombrydning css
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:
char til heltal java
- 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.