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:
- Iterování každého prvku daného původního pole a kopírování jednoho prvku po druhém
- Použití metody clone().
- Použití metody arraycopy().
- Použití metody copyOf() třídy Arrays
- 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.