logo

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:

  1. Pakartokite kiekvieną nurodyto pradinio masyvo elementą ir nukopijuokite vieną elementą vienu metu
  2. Naudojant klono() metodą
  3. Naudojant arraycopy() metodą
  4. Naudojant Arrays klasės metodą copyOf().
  5. 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

išpakavimas naudojant linux
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:

nedeterministiniai baigtiniai automatai
  • 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.