logo

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:

  1. Iterare ogni elemento dell'array originale fornito e copiare un elemento alla volta
  2. Utilizzando il metodo clone()
  3. Utilizzando il metodo arraycopy()
  4. Utilizzando il metodo copyOf() della classe Arrays
  5. 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

quando finisce q1
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

test e tipi di software
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.