Kopírovanie poľa v jazyku Java
Vzhľadom na pole musíme skopírovať jeho prvky do iného poľa, naivnému používateľovi príde na myseľ nižšie uvedený spôsob, ktorý je však nesprávny, ako je znázornené nižšie:
// 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; Výkon:
Vysvetlenie výstupu: Keď urobíme b = a, v skutočnosti priraďujeme odkaz na pole. Ak teda urobíme akúkoľvek zmenu v jednom poli, odrazí sa to aj v iných poliach, pretože obe a aj b odkazujú na to isté miesto. Môžeme to tiež overiť pomocou kódu, ako je uvedené nižšie:
Príklad:
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] + ' '); } }> |
Výkon
Contents of a[] 2 8 3 Contents of b[] 2 8 3
Metódy:
Videli sme vnútornú prácu pri kopírovaní prvkov a okrajových prípadov, ktoré je potrebné vziať do úvahy po prekonaní chýb vygenerovaných vyššie, takže teraz môžeme navrhnúť správne spôsoby kopírovania poľa, ako je uvedené nižšie:
- Iterovanie každého prvku daného pôvodného poľa a kopírovanie jedného prvku naraz
- Použitie metódy clone().
- Použitie metódy arraycopy().
- Použitie metódy copyOf() triedy Arrays
- Použitie metódy copyOfRange() triedy Arrays
Metóda 1: Iterovanie každého prvku daného pôvodného poľa a kopírovanie jedného prvku naraz. Pri použití tejto metódy je zaručené, že akékoľvek úpravy b nezmenia pôvodné pole a, ako je znázornené v nasledujúcom príklade:
Príklad:
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] + ' '); } }> |
Výkon
Contents of a[] 1 8 3 Contents of b[] 2 8 3
Metóda 2: Použitie metódy Clone().
V predchádzajúcej metóde sme museli opakovať celé pole, aby sme vytvorili kópiu, môžeme to urobiť lepšie? Áno, v jazyku Java môžeme použiť metódu klonovania.
Príklad:
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] + ' '); } }> |
Výkon
Contents of a[] 1 8 3 Contents of b[] 2 8 3
Metóda 3: Použitie metódy arraycopy().
Môžeme použiť aj System.arraycopy() Metóda. Systém je prítomný v balíku java.lang. Jeho podpis je nasledovný:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
Parametre:
- src označuje zdrojové pole.
- srcPos je index, od ktorého sa začína kopírovanie.
- začať označuje cieľové pole
- destPos je index, z ktorého sú skopírované prvky umiestnené v cieľovom poli.
- dĺžka je dĺžka podpolia, ktoré sa má skopírovať.
Príklad:
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] + ' '); } }> |
Výkon
Contents of a[] 1 8 3 Contents of b[] 2 8 3
Metóda 4: Použitie metódy copyOf() triedy Arrays
Ak chceme skopírovať niekoľko prvých prvkov poľa alebo úplnú kópiu poľa, môžete použiť túto metódu.
Syntax:
public static int[] copyOf?(int[] original, int newLength)
Parametre:
- Pôvodné pole
- Dĺžka poľa, ktoré sa má skopírovať.
Príklad:
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] + ' '); } }> |
Výkon
Contents of a[] 1 8 3 Contents of b[] 2 8 3
Metóda 5: Použitie metódy copyOfRange() triedy Arrays
Táto metóda skopíruje zadaný rozsah zadaného poľa do nového poľa.
public static int[] copyOfRange?(int[] original, int from, int to)
Parametre:
- Pôvodné pole, z ktorého sa má skopírovať rozsah
- Počiatočný index rozsahu, ktorý sa má skopírovať
- Konečný index rozsahu, ktorý sa má skopírovať, exkluzívny
Príklad:
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] + ' '); } }> |
Výkon
Contents of a[] 1 8 3 5 9 10 Contents of b[] 3 5 9 10
Nakoniec poďme diskutovať o prehľad vyššie uvedených metód:
- Jednoduché priraďovanie referencií je nesprávne
- Pole je možné skopírovať opakovaním cez pole a postupným priraďovaním prvkov.
- Môžeme sa vyhnúť opakovaniu prvkov pomocou clone() alebo System.arraycopy()
- clone() vytvorí nové pole rovnakej veľkosti, ale System.arraycopy() možno použiť na kopírovanie zo zdrojového rozsahu do cieľového rozsahu.
- System.arraycopy() je rýchlejší ako clone(), pretože používa natívne rozhranie Java
- Ak chcete skopírovať niekoľko prvých prvkov poľa alebo úplnú kópiu poľa, môžete použiť metódu Arrays.copyOf().
- Arrays.copyOfRange() sa používa na kopírovanie špecifikovaného rozsahu poľa. Ak počiatočný index nie je 0, môžete túto metódu použiť na skopírovanie čiastočného poľa.