Array Copy i Java

Array Copy i Java

Med tanke på en array måste vi kopiera dess element i en annan array, till en naiv användare nedan sätt kommer i åtanke vilket dock är felaktigt som avbildas nedan enligt följande:

// 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; 

Produktion:

Utgångsförklaring: När vi gör b = a, tilldelar vi faktiskt en referens till arrayen. Därför, om vi gör någon ändring i en array, skulle den också återspeglas i andra arrayer eftersom både a och b refererar till samma plats. Vi kan också verifiera det med kod som visas nedan enligt följande:

Exempel:

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] + ' '); } }>

Produktion

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

Metoder:

Vi har sett internt arbete under kopiering av element och kantfall som ska tas i beaktande efter att ha kommit igenom fel som genererats ovan, så nu kan vi föreslå korrekta sätt att kopiera array enligt nedan enligt följande:

  1. Itererar varje element i den givna originalmatrisen och kopierar ett element i taget
  2. Använder metoden clone().
  3. Använder metoden arraycopy().
  4. Använder metoden copyOf() i klassen Arrays
  5. Använder metoden copyOfRange() i klassen Arrays

Metod 1: Itererar varje element i den givna originalmatrisen och kopierar ett element i taget. Med användningen av denna metod garanterar den att eventuella ändringar av b inte kommer att ändra den ursprungliga arrayen a, som visas i nedanstående exempel enligt följande:

Exempel:

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] + ' '); } }>

Produktion

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

Metod 2: Använder metoden Clone().

I den tidigare metoden var vi tvungna att iterera över hela arrayen för att göra en kopia, kan vi göra det bättre? Ja, vi kan använda klonmetoden i Java .

Exempel:

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] + ' '); } }>

Produktion

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

Metod 3: Använder metoden arraycopy().

Vi kan också använda System.arraycopy() Metod. Systemet finns i paketet java.lang. Dess signatur är som:

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

Parametrar:

  • src anger källmatrisen.
  • srcPos är indexet från vilket kopieringen startar.
  • Start anger destinationsmatrisen
  • destPos är indexet från vilket de kopierade elementen placeras i målarrayen.
  • längd är längden på subarrayen som ska kopieras.

Exempel:

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] + ' '); } }>

Produktion

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

Metod 4: Använder metoden copyOf() i klassen Arrays

Om vi ​​vill kopiera de första elementen i en array eller en fullständig kopia av arrayen kan du använda den här metoden.

Syntax:

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

Parametrar:

  • Original array
  • Längden på arrayen som ska kopieras.

Exempel:

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] + ' '); } }>

Produktion

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

Metod 5: Använder metoden copyOfRange() i klassen Arrays

Denna metod kopierar det angivna intervallet för den angivna arrayen till en ny array.

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

Parametrar:

  • Originalmatris från vilken ett område ska kopieras
  • Initialt index för intervallet som ska kopieras
  • Slutligt index för intervallet som ska kopieras, exklusivt

Exempel:

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] + ' '); } }>

Produktion

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

Låt oss slutligen diskutera översikt över ovanstående metoder:

  • Att bara tilldela referenser är fel
  • Arrayen kan kopieras genom att iterera över en array och en efter en tilldela element.
  • Vi kan undvika iteration över element använder clone() eller System.arraycopy()
  • clone() skapar en ny array av samma storlek, men System.arraycopy() kan användas för att kopiera från ett källområde till ett målområde.
  • System.arraycopy() är snabbare än clone() eftersom den använder Java Native Interface
  • Om du vill kopiera de första elementen i en array eller en fullständig kopia av en array kan du använda metoden Arrays.copyOf() .
  • Arrays.copyOfRange() används för att kopiera ett specificerat intervall för en array. Om startindexet inte är 0, kan du använda den här metoden för att kopiera en partiell array.