2009-05-05 15 views
5

Guardavo attraverso la documentazione Java e mi sono imbattuto nel metodo clear() di ArrayLists.Utilità di ArrayList <E> .clear()?

Qual è l'uso di questo, al contrario di riassegnazione semplicemente un nuovo oggetto ArrayList alla variabile?

+0

Si noti che il metodo clear() è definito da Collection. È presente anche nell'interfaccia della mappa. –

risposta

14

perché ci potrebbe essere più riferimenti alla sola lista, potrebbe essere preferibile e/o più pratico per cancellarlo di riassegnazione tutti i riferimenti.

Se si svuota l'array molto (all'interno, per esempio, un ciclo di grandi dimensioni) non c'è motivo di creare un sacco di oggetti temporanei. Certo, il garbage collector finirà per ripulirli, ma non è inutile sprecare risorse se non è necessario.

E perché cancellare l'elenco è meno utile che crearne uno nuovo.

+3

In realtà, in alcuni casi il riutilizzo di una raccolta può causare problemi di memoria. In breve, se una grande ArrayList (o simili) viene tenuta in giro per un lungo periodo, viene promossa alla generazione di tenured. Quindi qualsiasi elemento in esso contenuto che potrebbe essere spazzatura nella giovane generazione non può essere raccolto senza una generazione intera (che analizza la generazione di tenured e può vedere che gli elementi sono davvero spazzatura). – erickson

1

chiaro() non ricollocamento di nuovo oggetto, quindi è meno di un calo di prestazioni.

2

immaginare la situazione in cui v'è più riferimenti dello stesso java.util.ArrayList in tutto il codice. Sarebbe quasi impossibile o molto difficile creare una nuova istanza della lista e assegnarla a tutte le variabili. Ma lo java.util.ArrayList.clear() fa il trucco!

3

si potrebbe avere un campo finale (variabile di classe) List:

private final List<Thing> things = ... 

Da qualche parte nella classe che si desidera cancellare (rimuovere tutte) le cose. Poiché things è definitivo, non può essere riassegnato. Inoltre, probabilmente non si desidera riassegnare una nuova istanza di List poiché è già stato creato un elenco perfettamente valido.

2

Si paga meno con chiaro di quello che si fa con la creazione di un nuovo oggetto se il tuo obiettivo era davvero chiaro.

La riassegnazione di un riferimento non cancella l'oggetto. Il presupposto è che se non ci sono altri riferimenti ad esso, verrebbe recuperato dal GC relativamente presto. Altrimenti, ti sei fatto un casino.

2

Oltre ai motivi citati, l'eliminazione di un elenco è spesso più semanticamente corretto rispetto alla creazione di uno nuovo. Se il risultato desiderato è un elenco cancellato, l'azione da eseguire è cancellare l'elenco, non creare un nuovo elenco.

Problemi correlati