Copia di array in Java
Dato un array, dobbiamo copiare i suoi elementi in un array diverso, a un utente ingenuo viene in mente il modo seguente che è tuttavia errato come illustrato di seguito come segue:
// 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; Produzione:
Spiegazione dell'uscita: Quando facciamo b = a, stiamo effettivamente assegnando un riferimento all'array. Quindi, se apportiamo qualsiasi modifica a un array, ciò si rifletterà anche sugli altri array perché sia a che b si riferiscono alla stessa posizione. Possiamo anche verificarlo con il codice mostrato di seguito come segue:
Esempio:
Giava
// 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] + ' '); } }> |
Produzione
Contents of a[] 2 8 3 Contents of b[] 2 8 3
Metodi:
Abbiamo visto il funzionamento interno durante la copia di elementi e casi limite da prendere in considerazione dopo aver superato gli errori generati sopra, quindi ora possiamo proporre modi corretti per copiare l'array come elencato di seguito come segue:
- Iterare ogni elemento dell'array originale fornito e copiare un elemento alla volta
- Utilizzando il metodo clone()
- Utilizzando il metodo arraycopy()
- Utilizzando il metodo copyOf() della classe Arrays
- Utilizzando il metodo copyOfRange() della classe Arrays
Metodo 1: Iterare ogni elemento dell'array originale fornito e copiare un elemento alla volta. Con l'utilizzo di questo metodo, si garantisce che qualsiasi modifica a b non altererà l'array originale a, come mostrato nell'esempio seguente:
Esempio:
Giava
// 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] + ' '); } }> |
Produzione
Contents of a[] 1 8 3 Contents of b[] 2 8 3
Metodo 2: Utilizzando il metodo Clone()
Nel metodo precedente dovevamo scorrere l'intero array per crearne una copia, possiamo fare di meglio? Sì, possiamo utilizzare il metodo clone in Java.
Esempio:
Giava
// 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] + ' '); } }> |
Produzione
Contents of a[] 1 8 3 Contents of b[] 2 8 3
Metodo 3: Utilizzando il metodo arraycopy()
Possiamo anche usare System.arraycopy() Metodo. Il sistema è presente nel pacchetto java.lang. La sua firma è:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
parametri:
- src denota l'array di origine.
- srcPos è l'indice da cui inizia la copia.
- inizio denota l'array di destinazione
- destPos è l'indice da cui vengono inseriti gli elementi copiati nell'array di destinazione.
- lunghezza è la lunghezza del sottoarray da copiare.
Esempio:
Giava
// 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] + ' '); } }> |
Produzione
Contents of a[] 1 8 3 Contents of b[] 2 8 3
Metodo 4: Utilizzando il metodo copyOf() della classe Arrays
Se vogliamo copiare i primi elementi di un array o una copia completa dell'array, possiamo utilizzare questo metodo.
Sintassi:
public static int[] copyOf?(int[] original, int newLength)
parametri:
- Matrice originale
- Lunghezza dell'array da copiare.
Esempio:
Giava
// 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] + ' '); } }> |
Produzione
Contents of a[] 1 8 3 Contents of b[] 2 8 3
Metodo 5: Utilizzando il metodo copyOfRange() della classe Arrays
Questo metodo copia l'intervallo specificato dell'array specificato in un nuovo array.
public static int[] copyOfRange?(int[] original, int from, int to)
parametri:
- Array originale da cui copiare un intervallo
- Indice iniziale dell'intervallo da copiare
- Indice finale dell'intervallo da copiare, esclusivo
Esempio:
Giava
// 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] + ' '); } }> |
Produzione
Contents of a[] 1 8 3 5 9 10 Contents of b[] 3 5 9 10
Infine, discutiamo di panoramica dei metodi di cui sopra:
- Assegnare semplicemente dei riferimenti è sbagliato
- L'array può essere copiato eseguendo un'iterazione su un array e assegnando uno per uno gli elementi.
- Possiamo evitare l'iterazione sugli elementi utilizzando clone() o System.arraycopy()
- clone() crea un nuovo array della stessa dimensione, ma System.arraycopy() può essere utilizzato per copiare da un intervallo di origine a un intervallo di destinazione.
- System.arraycopy() è più veloce di clone() poiché utilizza Java Native Interface
- Se vuoi copiare i primi elementi di un array o una copia completa di un array, puoi utilizzare il metodo Arrays.copyOf().
- Arrays.copyOfRange() viene utilizzato per copiare un intervallo specificato di un array. Se l'indice iniziale non è 0, puoi utilizzare questo metodo per copiare un array parziale.