Če imamo matriko, moramo njene elemente kopirati v drugo matriko, naivnemu uporabniku pride na misel spodnji način, ki pa je napačen, kot je prikazano spodaj, kot sledi:
// 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;>
Izhod:
Izhodna razlaga: Ko naredimo b = a, dejansko dodelimo sklic na matriko. Če torej naredimo kakršno koli spremembo v eni matriki, bi se to odrazilo tudi v drugih matrikah, ker se tako a kot b nanašata na isto lokacijo. Lahko ga tudi preverimo s kodo, kot je prikazano spodaj, kot sledi:
primer:
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] + ' '); } }> |
>
>Izhod
Contents of a[] 2 8 3 Contents of b[] 2 8 3>
Metode:
Videli smo notranje delo med kopiranjem elementov in robnih primerov, ki jih je treba upoštevati, potem ko prebrodimo zgoraj ustvarjene napake, tako da lahko zdaj predlagamo pravilne načine za kopiranje niza, kot je navedeno spodaj, kot sledi:
- Ponavljanje vsakega elementa dane izvirne matrike in kopiranje enega elementa naenkrat
- Uporaba metode clone().
- Uporaba metode arraycopy().
- Uporaba metode copyOf() razreda Arrays
- Uporaba metode copyOfRange() razreda Arrays
1. način: Ponavljanje vsakega elementa dane izvirne matrike in kopiranje enega elementa naenkrat. Z uporabo te metode zagotavlja, da nobena sprememba b ne bo spremenila izvirne matrike a, kot je prikazano v spodnjem primeru, kot sledi:
primer:
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] + ' '); } }> |
>
>Izhod
standardni odklon numpy
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
2. način: Uporaba metode Clone().
Pri prejšnji metodi smo morali ponoviti celotno matriko, da smo naredili kopijo, ali lahko naredimo bolje? Da, v Javi lahko uporabimo metodo kloniranja.
primer:
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] + ' '); } }> |
>
>Izhod
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
3. način: Uporaba metode arraycopy().
Lahko tudi uporabimo System.arraycopy() Metoda. Sistem je prisoten v paketu java.lang. Njegov podpis je naslednji:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)>
Parametri:
- src označuje izvorno polje.
- srcPos je indeks, s katerega se začne kopiranje.
- začetek označuje ciljno matriko
- destPos je indeks, iz katerega so kopirani elementi postavljeni v ciljno matriko.
- dolžina je dolžina podmatrike, ki jo želite kopirati.
primer:
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] + ' '); } }> |
>
>Izhod
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
4. način: Uporaba metode copyOf() razreda Arrays
Če želimo kopirati prvih nekaj elementov matrike ali celotno kopijo matrike, lahko uporabite to metodo.
Sintaksa:
public static int[] copyOf?(int[] original, int newLength)>
Parametri:
- Izvirna matrika
- Dolžina niza za kopiranje.
primer:
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] + ' '); } }> |
>
>Izhod
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
5. način: Uporaba metode copyOfRange() razreda Arrays
Ta metoda kopira navedeni obseg podane matrike v novo matriko.
public static int[] copyOfRange?(int[] original, int from, int to)>
Parametri:
- Izvirna matrika, iz katere je treba kopirati obseg
- Začetni indeks obsega, ki ga želite kopirati
- Končni indeks obsega, ki ga želite kopirati, izključno
primer:
Java
ubuntu build bistveno
// 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] + ' '); } }> |
>
>Izhod
Contents of a[] 1 8 3 5 9 10 Contents of b[] 3 5 9 10>
Na koncu se pogovorimo o pregled zgornjih metod:
- Preprosto dodeljevanje referenc je napačno
- Matriko je mogoče kopirati s ponavljanjem po matriki in dodeljevanjem elementov enega za drugim.
- Lahko se izognemo ponavljanju elementov z uporabo clone() ali System.arraycopy()
- clone() ustvari novo matriko enake velikosti, vendar System.arraycopy() lahko uporabite za kopiranje iz izvornega obsega v ciljni obseg.
- System.arraycopy() je hitrejši od clone(), saj uporablja izvorni vmesnik Java
- Če želite kopirati prvih nekaj elementov matrike ali celotno kopijo matrike, lahko uporabite metodo Arrays.copyOf().
- Arrays.copyOfRange() se uporablja za kopiranje določenega obsega matrike. Če začetni indeks ni 0, lahko s to metodo kopirate delno matriko.