Copiare un array in java

In questo articolo elenco diverse modalità per copiare array di dati primitivi e di oggetti in un altro array.

  • Copia di un array unidimensionale di primitive: supponi di voler copiare un array unidimensionale di valori interi chiamato “a” in un array chiamato “b”, la semplice assegnazione

    non funziona.
    Infatti considera il seguente codice:

    che ha come output:

    E’ evidente che “a” e “b” puntano sullo stesso oggetto perché i cambiamenti di uno si riflettono sull’altro, questo codice non assegna una copia dell’oggetto a cui punta “a” a “b” ma copia la referenza sullo stesso oggetto.
    Il seguente codice crea una copia dell’oggetto di “a” e lo assegna a “b” utilizzando il metodo statico System.arraycopy:


    E’ anche possibile eseguire la copia dell’oggetto copiando ogni singolo elemento all’interno di un loop.
  • Copia di array multidimensionale di primitive: con array multidimensionali non è possibile usare System.arraycopy ma devi assegnare i singoli elementi all’interno di un loop:

    con output:

    Nel caso di un array a due dimensioni è possibile usare System.arraycopy per assegnare un’intera riga all’interno di un ciclo for:
  • Copia di un array di oggetti: i punti precedenti riguardano array di primitive, qui invece intendo copiare un array di oggetti in questo caso oggetti della classe Point.
    Un primo tentativo potrebbe essere questo:

    ma come tu puoi verificare dall’output:

    non funziona perchè alla riga 21 non copio l’elemento ma la referenza all’elemento.
    Il codice corretto è:

    che genera l’output:

    Per ottenere una copia dell’oggetto Point ho utilizzato un costruttore a cui è passato l’oggetto da copiare (copy constructor).
    In alcuni casi è anche possibile utilizzare il metodo clone per copiare un oggetto ma bisogna fare attenzione perché il metodo clone potrebbe non restituire una copia senza alcun collegamento all’originale, in particolare nel caso in cui la classe contenga membri non primitivi che sono copiati per referenza.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.