logo

Array Copy i Java

Gitt en matrise, må vi kopiere dens elementer i en annen matrise, til en naiv bruker nedenfor måte kommer i tankene som imidlertid er feil som vist 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;>

Produksjon:



Utgangsforklaring: Når vi gjør b = a, tildeler vi faktisk en referanse til matrisen. Derfor, hvis vi gjør noen endring i en matrise, vil den også reflekteres i andre matriser fordi både a og b refererer til samme plassering. Vi kan også bekrefte 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] + ' '); } }>

>

>

Produksjon

Contents of a[] 2 8 3 Contents of b[] 2 8 3>

Metoder:

Vi har sett internt arbeid under kopiering av elementer og kantsaker som skal tas i betraktning etter å ha kommet gjennom feil som generert ovenfor, så nå kan vi foreslå riktige måter å kopiere array som listet nedenfor som følger:

  1. Iterering av hvert element i den gitte originale matrisen og kopier ett element om gangen
  2. Bruker klone() metoden
  3. Bruker arraycopy()-metoden
  4. Bruker metoden copyOf() i Arrays-klassen
  5. Bruker metoden copyOfRange() i Arrays-klassen

Metode 1: Iterering av hvert element i den gitte originale matrisen og kopier ett element om gangen. Med bruken av denne metoden garanterer den at eventuelle modifikasjoner av b, ikke vil endre den opprinnelige matrisen a, som vist i eksemplet nedenfor 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] + ' '); } }>

>

>

Produksjon

ordbryting css
Contents of a[] 1 8 3 Contents of b[] 2 8 3>

Metode 2: Bruker Clone() metoden

I den forrige metoden måtte vi iterere over hele arrayet for å lage en kopi, kan vi gjøre det bedre? Ja, vi kan bruke klonemetoden 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] + ' '); } }>

>

>

Produksjon

Contents of a[] 1 8 3 Contents of b[] 2 8 3>

Metode 3: Bruker arraycopy()-metoden

Vi kan også bruke System.arraycopy() Metode. Systemet er til stede i java.lang-pakken. Signaturen er som:

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)>

Parametere:

  • src angir kildematrisen.
  • srcPos er indeksen som kopieringen starter fra.
  • start angir destinasjonsmatrisen
  • destPos er indeksen som de kopierte elementene plasseres fra i målmatrisen.
  • lengde er lengden på undergruppen som 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] + ' '); } }>

>

>

Produksjon

Contents of a[] 1 8 3 Contents of b[] 2 8 3>

Metode 4: Bruker metoden copyOf() i Arrays-klassen

Hvis vi ønsker å kopiere de første elementene i en matrise eller en full kopi av matrisen, kan du bruke denne metoden.

Syntaks:

public static int[] copyOf?(int[] original, int newLength)>

Parametere:

hvordan konvertere et heltall til en streng i java
  • Original array
  • Lengden på matrisen som 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] + ' '); } }>

>

>

Produksjon

Contents of a[] 1 8 3 Contents of b[] 2 8 3>

Metode 5: Bruker metoden copyOfRange() i Arrays-klassen

Denne metoden kopierer det spesifiserte området til den angitte matrisen til en ny matrise.

public static int[] copyOfRange?(int[] original, int from, int to)>

Parametere:

  • Original matrise som et område skal kopieres fra
  • Innledende indeks for området som skal kopieres
  • Endelig indeks over området som 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] + ' '); } }>

>

>

Produksjon

Contents of a[] 1 8 3 5 9 10 Contents of b[] 3 5 9 10>

Til slutt, la oss diskutere oversikt over metodene ovenfor:

  • Bare å tildele referanser er feil
  • Matrisen kan kopieres ved å iterere over en matrise, og én etter én tilordne elementer.
  • Vi kan unngå iterasjon over elementer ved å bruke clone() eller System.arraycopy()
  • clone() oppretter en ny matrise av samme størrelse, men System.arraycopy() kan brukes til å kopiere fra et kildeområde til et målområde.
  • System.arraycopy() er raskere enn clone() ettersom den bruker Java Native Interface
  • Hvis du vil kopiere de første par elementene i en matrise eller en fullstendig kopi av en matrise, kan du bruke Arrays.copyOf() metoden.
  • Arrays.copyOfRange() brukes til å kopiere et spesifisert område av en matrise. Hvis startindeksen ikke er 0, kan du bruke denne metoden til å kopiere en delvis matrise.