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.