Masyvo kopijavimas Java
Turėdami masyvą, turime nukopijuoti jo elementus į kitą masyvą, naiviam vartotojui turint omenyje toliau pateiktą būdą, kuris yra neteisingas, kaip parodyta toliau taip:
// 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; Išvestis:
Išvesties paaiškinimas: Kai darome b = a, mes iš tikrųjų priskiriame nuorodą į masyvą. Taigi, jei atliktume bet kokius vieno masyvo pakeitimus, tai atsispindėtų ir kituose masyvuose, nes ir a, ir b nurodo tą pačią vietą. Taip pat galime patikrinti naudodami kodą, kaip parodyta toliau taip:
Pavyzdys:
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] + ' '); } }> |
Išvestis
Contents of a[] 2 8 3 Contents of b[] 2 8 3
Metodai:
Pastebėjome, kad vidinis darbas kopijuojant elementus ir kraštinius atvejus turi būti atsižvelgta įveikus anksčiau sugeneruotas klaidas, todėl dabar galime pasiūlyti teisingus būdus, kaip kopijuoti masyvą, kaip nurodyta toliau:
- Pakartokite kiekvieną nurodyto pradinio masyvo elementą ir nukopijuokite vieną elementą vienu metu
- Naudojant klono() metodą
- Naudojant arraycopy() metodą
- Naudojant Arrays klasės metodą copyOf().
- Naudojant Arrays klasės metodą copyOfRange().
1 būdas: Pakartokite kiekvieną nurodyto pradinio masyvo elementą ir nukopijuokite vieną elementą vienu metu. Naudojant šį metodą, garantuojama, kad bet kokie b pakeitimai nepakeis pradinio masyvo a, kaip parodyta toliau pateiktame pavyzdyje:
Pavyzdys:
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] + ' '); } }> |
Išvestis
Contents of a[] 1 8 3 Contents of b[] 2 8 3
2 būdas: Naudojant Clone() metodą
Naudodami ankstesnį metodą, norėdami padaryti kopiją, turėjome kartoti visą masyvą, ar galime padaryti geriau? Taip, „Java“ galime naudoti klonavimo metodą.
Pavyzdys:
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] + ' '); } }> |
Išvestis
Contents of a[] 1 8 3 Contents of b[] 2 8 3
3 būdas: Naudojant arraycopy() metodą
Taip pat galime naudoti System.arraycopy() Metodas. Sistema yra java.lang pakete. Jo parašas yra toks:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
Parametrai:
- src žymi šaltinio masyvą.
- srcPos yra indeksas, nuo kurio pradedamas kopijavimas.
- pradėti žymi paskirties masyvą
- destPos yra indeksas, iš kurio nukopijuoti elementai dedami į paskirties masyvą.
- ilgio yra kopijuojamo pogrupio ilgis.
Pavyzdys:
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] + ' '); } }> |
Išvestis
Contents of a[] 1 8 3 Contents of b[] 2 8 3
4 būdas: Naudojant Arrays klasės metodą copyOf().
Jei norime nukopijuoti kelis pirmuosius masyvo elementus arba visą masyvo kopiją, galite naudoti šį metodą.
Sintaksė:
public static int[] copyOf?(int[] original, int newLength)
Parametrai:
- Originalus masyvas
- Masyvo, kurį reikia nukopijuoti, ilgis.
Pavyzdys:
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] + ' '); } }> |
Išvestis
Contents of a[] 1 8 3 Contents of b[] 2 8 3
5 būdas: Naudojant Arrays klasės metodą copyOfRange().
Šis metodas nukopijuoja nurodytą nurodyto masyvo diapazoną į naują masyvą.
public static int[] copyOfRange?(int[] original, int from, int to)
Parametrai:
- Originalus masyvas, iš kurio reikia nukopijuoti diapazoną
- Pradinis kopijuojamo diapazono indeksas
- Galutinis kopijuojamo diapazono indeksas, išskirtinis
Pavyzdys:
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] + ' '); } }> |
Išvestis
Contents of a[] 1 8 3 5 9 10 Contents of b[] 3 5 9 10
Galiausiai aptarkime pirmiau minėtų metodų apžvalga:
- Tiesiog priskirti nuorodas yra neteisinga
- Masyvą galima nukopijuoti kartojant per masyvą ir po vieną priskiriant elementus.
- Galime išvengti elementų iteracijos naudojant clone() arba System.arraycopy()
- clone() sukuria naują tokio pat dydžio masyvą, bet System.arraycopy() gali būti naudojamas kopijuoti iš šaltinio diapazono į paskirties diapazoną.
- System.arraycopy() yra greitesnis nei clone(), nes naudoja Java Native Interface
- Jei norite nukopijuoti kelis pirmuosius masyvo elementus arba visą masyvo kopiją, galite naudoti Arrays.copyOf() metodą.
- Arrays.copyOfRange() naudojamas nurodytam masyvo diapazonui nukopijuoti. Jei pradinis indeksas nėra 0, galite naudoti šį metodą daliniam masyvei nukopijuoti.