2010-09-29 10 views
26

Uso di Java (1.6) è meglio chiamare il metodo clear() su una lista o semplicemente ricomporre il riferimento?Migliore pratica per riattivare una lista o invocare clear()

Ho una lista di array che è piena di un numero sconosciuto di oggetti e periodicamente "svuotata" - dove gli oggetti vengono elaborati e l'elenco è cancellato. Una volta scaricato, l'elenco viene riempito di nuovo. Il colore si verifica in un momento casuale. Il numero all'interno dell'elenco può essere potenzialmente piccolo (10 s di oggetti) o grande (milioni di oggetti).

Quindi è meglio avere la chiamata "flush" clear() o la nuova ArrayList()?

Vale la pena di preoccuparsi di questo tipo di problemi o dovrei lasciarmi preoccupare dalla VM? Come potrei andare a guardare l'impronta della memoria di Java per far funzionare questo genere di cose per me stesso?

Qualsiasi aiuto molto apprezzato.

+0

Nota La risposta di Jon relativa alla porzione di ottimizzazione: se si ha a che fare con un'intensità elevata e c'è una lentezza, quindi tracciarlo. Se il problema è chiaro, puoi provare a cambiarlo per creare una nuova lista. Altrimenti, usa quello che è il più semanticamente corretto, cioè ciò che il codice sta effettivamente cercando di fare. – aperkins

+0

relative alle prestazioni: [map-clear-vs-new-map-which-one-will-be-better] (http://stackoverflow.com/questions/6757868/map-clear-vs-new-map-which- one-will-be-better) – nawfal

risposta

29

La cosa principale di cui preoccuparsi è che il codice altro potrebbe avere un riferimento all'elenco. Se l'elenco esistente è visibile altrove, vuoi che quel codice visualizzi un elenco cancellato o mantenga quello esistente?

Se nient'altro può vedere la lista, probabilmente la cancellerei, ma non per motivi di prestazioni; solo perché il modo in cui hai descritto l'operazione suona come più come una "creazione di una nuova lista".

I ArrayList<T> documentazione non specificano cosa succede ai sottostanti strutture di dati, ma guardando il 1,7 implementazione in Eclipse, sembra che probabilmente si dovrebbe chiamare trimToSize() dopo clear() - altrimenti si potrebbe ancora avere una lista sostenuta da una grande matrice di riferimenti null. (Forse non è un problema per te, ovviamente ... forse è più efficiente che dover copiare l'array quando la dimensione si ricompone. Ne saprai di più di quello che facciamo.)

(Ovviamente la creazione di un nuovo elenco non richiede la vecchia lista di impostare tutti gli elementi dell'array su null ... ma dubito che ciò sarà significativo nella maggior parte dei casi.)

+0

La visibilità non è un problema.Mi piace il tuo ragionamento per il metodo chiaro, poiché aiuta a descrivere cosa sta succedendo. Non avevo mai visto trimToSize() prima - lo verificherò – Phil

+0

Inoltre, intendevi l'implementazione "1.7"? Sicuramente Eclipse non supporta Java 1.7 (dal momento che non è ancora uscito) o ho erroneamente interpretato. – Phil

+0

@Phil: sto usando build 1.7.0-ea-b78. È l'unica JVM su questo sistema. Anche se non è stato rilasciato, ce ne sono state costruite da secoli, e Eclipse gira su di esso senza problemi che ho visto. –

1

Penso che anche l'Arraylist sia troppo frequentemente scaricato, come se fosse eseguito continuamente in loop o qualcosa del genere quindi meglio usare chiaro se lo svuotamento non è troppo frequente, quindi si può creare una nuova istanza. Inoltre, dal momento che si dice che gli elementi possono variare da 10 a milioni di oggetti, si può probabilmente andare a tra le dimensioni per ogni nuovo Arraylist la tua creazione in modo che l'arraylist possa evitare di ridimensionare un sacco di tempo.

2

Il modo in cui lo si utilizza assomiglia molto a come viene utilizzato uno Queue. Quando lavori degli articoli in coda vengono rimossi quando li tratti.

L'utilizzo di una delle classi Coda potrebbe rendere il codice più elegante.

Esistono anche varianti che gestiscono aggiornamenti simultanei in modo prevedibile.

Problemi correlati