logo

Kopírování pole v Javě

Vzhledem k poli musíme zkopírovat jeho prvky do jiného pole, naivnímu uživateli přijde na mysl níže uvedený způsob, který je však nesprávný, jak je znázorněno níže:

// 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ýstup:



Vysvětlení výstupu: Když uděláme b = a, ve skutečnosti přiřadíme odkaz na pole. Pokud tedy provedeme jakoukoli změnu v jednom poli, projeví se to i v jiných polích, protože obě a i b odkazují na stejné místo. Můžeme to také ověřit pomocí kódu, jak je uvedeno níže takto:

Příklad:



Jáva






// 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ýstup

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

Metody:

Viděli jsme interní práci při kopírování prvků a okrajových případů, které je třeba vzít v úvahu po překonání chyb vygenerovaných výše, takže nyní můžeme navrhnout správné způsoby kopírování pole, jak je uvedeno níže:

  1. Iterování každého prvku daného původního pole a kopírování jednoho prvku po druhém
  2. Použití metody clone().
  3. Použití metody arraycopy().
  4. Použití metody copyOf() třídy Arrays
  5. Použití metody copyOfRange() třídy Arrays

Metoda 1: Iterování každého prvku daného původního pole a kopírování jednoho prvku po druhém. Při použití této metody je zaručeno, že jakékoli úpravy b nezmění původní pole a, jak je znázorněno v následujícím příkladu:

Příklad:

Jáva




// 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ýstup

binární vyhledávací strom]
Contents of a[] 1 8 3 Contents of b[] 2 8 3>

Metoda 2: Použití metody Clone().

V předchozí metodě jsme museli iterovat celé pole, abychom vytvořili kopii, můžeme to udělat lépe? Ano, v Javě můžeme použít metodu klonování.

Příklad:

Jáva




// 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ýstup

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

Metoda 3: Použití metody arraycopy().

Můžeme také použít System.arraycopy() Metoda. Systém je přítomen v balíčku java.lang. Jeho podpis je takto:

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

Parametry:

  • src označuje zdrojové pole.
  • srcPos je index, od kterého začíná kopírování.
  • Start označuje cílové pole
  • destPos je index, ze kterého jsou zkopírované prvky umístěny do cílového pole.
  • délka je délka dílčího pole, které se má zkopírovat.

Příklad:

Jáva


seznam jako pole



// 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ýstup

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

Metoda 4: Použití metody copyOf() třídy Arrays

Pokud chceme zkopírovat několik prvních prvků pole nebo úplnou kopii pole, můžete použít tuto metodu.

Syntax:

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

Parametry:

  • Původní pole
  • Délka pole, které se má zkopírovat.

Příklad:

Jáva




// 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ýstup

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

Metoda 5: Použití metody copyOfRange() třídy Arrays

Tato metoda zkopíruje zadaný rozsah zadaného pole do nového pole.

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

Parametry:

  • Původní pole, ze kterého má být rozsah zkopírován
  • Počáteční index rozsahu, který se má zkopírovat
  • Konečný index rozsahu, který má být zkopírován, exkluzivní

Příklad:

Jáva




// 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ýstup

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

Nakonec pojďme diskutovat o přehled výše uvedených metod:

  • Jednoduché přiřazení referencí je špatné
  • Pole lze zkopírovat iterací přes pole a jeden po druhém přiřazování prvků.
  • Můžeme se vyhnout iteraci přes prvky pomocí clone() nebo System.arraycopy()
  • clone() vytvoří nové pole stejné velikosti, ale System.arraycopy() lze použít ke kopírování ze zdrojového rozsahu do cílového rozsahu.
  • System.arraycopy() je rychlejší než clone(), protože používá Java Native Interface
  • Pokud chcete zkopírovat několik prvních prvků pole nebo úplnou kopii pole, můžete použít metodu Arrays.copyOf().
  • Arrays.copyOfRange() se používá ke kopírování zadaného rozsahu pole. Pokud počáteční index není 0, můžete tuto metodu použít ke zkopírování částečného pole.