2013-07-23 11 views
7

Con 2 ArrayList, mi chiedevo se il modo migliore di trasformare il primo uno in un "copia" del secondo è quello di andare comemodo migliore per trasferire valore da un ArrayList all'altro

myFirstArray.clear(); 
myFirstArray.addAll(mySecondArray); 

o

myFirstArray = mySecondArray.clone(); 

quali sono le principali differenze tra questi due metodo, che è preferibile su e c'è un'altra soluzione o "semplice" "pulito". Grazie per eventuali suggerimenti

MODIFICA: Io uso questa copia per sostituire una matrice di oggetto im attualmente funzionante con quella in cui memorizzo l'oggetto con cui lavorerò nel ciclo successivo. Alla fine del loop sostituisco il mio currentArrayList con il mio futurArrayList e svuoto il mio futurArraylist per aggiungere un nuovo oggetto (spero sia abbastanza chiaro)

+0

Prestare attenzione se l'elenco è un gruppo di tipi di riferimento si può finire con elenchi che puntano allo stesso oggetto. –

+2

Solo un commento di stile: generalmente i nomi delle variabili devono iniziare con una lettera minuscola. Non solo per le persone che leggono il codice, ma anche l'evidenziazione della sintassi dello stackoverflow viene confusa! –

+0

Qual è l'obiettivo della tua copia? Sapere cosa vuoi fare ci aiuterà a darti la migliore risposta. –

risposta

12

Il primo sostituisce il contenuto della lista con un altro contenuto. Il secondo crea un'altra istanza ArrayList, lasciando intatta quella precedente.

Se l'elenco fa riferimento a qualche altro oggetto e si desidera che questo altro oggetto non venga toccato, utilizzare il secondo. Se vuoi che anche l'altro oggetto abbia il nuovo contenuto, usa il primo.

Se nessun altro fa riferimento all'elenco, non importa molto. Il secondo ridurrà la memoria utilizzata nel caso in cui si sostituisca il contenuto di una lista enorme con pochi elementi.

+0

Grazie per la precisione, il mio Arraylist è effettivamente referenziato da un altro oggetto quindi addAll è preferibile. – WizLiz

1

Usa che:

List<Object> first = ... 
ArrayList<Object> second = new ArrayList<>(first); 

suggerisco anche che non si usa clone() affatto. È meglio usare un costruttore di copie o un metodo di fabbrica. Dai un'occhiata a here.

Naturalmente nel tuo caso, con il ArrayList, funzionerà come previsto, si finirà con una copia dei riferimenti.

+0

non voglio la copia di riferimento. Voglio creare una nuova lista e modificarla. come posso farlo? –

+0

Se si desidera una copia profonda dell'elenco, è necessario creare una copia per ciascun oggetto nell'elenco. Ti suggerisco di creare un costruttore di copia per i tuoi oggetti e quindi semplicemente di ripetere quello vecchio e popolare quello nuovo. –

1

In java, sebbene il clone sia "destinato" a produrre una copia dello stesso oggetto, non è garantito. Il clone viene fornito con molti suoi e ma. Quindi il mio primo consiglio è di non dipendere dai cloni.

Per impostazione predefinita, la clonazione di java è 'copia campo per campo', ad esempio perché la classe Object non ha idea della struttura della classe su cui verrà invocato il metodo clone(). Quindi, JVM quando viene chiamato per la clonazione, fare le seguenti cose:

  1. Se la classe ha solo i membri dei tipi di dati primitivi, allora verrà creata una nuova copia completamente dell'oggetto e il riferimento alla nuova copia oggetto volontà essere restituito

  2. Se la classe contiene componenti di qualsiasi tipo classe solo l'oggetto riferimenti a quei membri vengono copiati e quindi l'organo riferimenti sia l'oggetto originale così come l'oggetto clonato riferiscono allo stesso oggetto a causa di le modifiche all'oggetto clonato sono visibili anche in originale.

+0

Nel mio caso, copiare solo il riferimento non è un problema reale perché intendo modificare quegli oggetti in modo che avere lo stesso riferimento sia vantaggioso. Ma grazie per la precisione – WizLiz

0

Guava, guava, guava!

final List copied = ImmutableList.copyOf(originalList); 
Problemi correlati