2013-08-14 7 views
7

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#473Perché java.util.Arraylist # clear ha implementato il modo in cui era in OpenJDK?

public void clear() { 
    modCount++; 

    // Let gc do its work 
    for (int i = 0; i < size; i++) 
     elementData[i] = null; 

    size = 0; 
} 

La mia domanda è, perché ha fatto quello che devono fare un ciclo attraverso l'array supporto {O (n)} di rendere ogni elemento per la garbage collection quando potevano solo hanno reinizializzata la matrice di supporto, scartando i riferimenti all'intero array nel suo complesso {O (1)} e rendendolo idoneo per la garbage collection? O (n) prestazioni per clear() non mi sembra così carino o mi manca qualcosa?

+2

possibile duplicato di [list.clear() vs list = new ArrayList ();] (http://stackoverflow.com/questions/6961356/list-clear-vs-list-new-arraylistinteger) – Tala

+0

I do penso che questo è un duplicato. – nawfal

risposta

9

Facendolo nel modo in cui lo facevano, è possibile riutilizzare l'array senza ridistribuire il proprio archivio di backup. Se si desidera riallocare l'array, è possibile farlo da soli, poiché la rappresentazione di ArrayList consiste principalmente nella sua archiviazione di backup.

Se rilasciassero l'array nel suo insieme, ci sarebbe ben poca differenza tra chiamare clear() e riassegnare lo stesso ArrayList. Ora ti danno la possibilità di scegliere tra riutilizzare l'array o sostituirlo con uno nuovo di zecca.

+0

Quasi allo stesso modo, si potrebbe aver fatto qualcosa di simile: 'per (loop_through_list as e) {e = null}' // pseudo codice –

+1

@SayoOladeji Giusto, ma ciò richiederebbe un ciclo e avrebbe bisogno di ulteriori argomenti controllando ogni volta che imposti un elemento su 'null'. Quando esegui 'new ArrayList()' scambi una riga per una riga, non una riga per un ciclo. – dasblinkenlight

+0

Ora ho una prospettiva completamente diversa dell'aspetto innocente 'def arr = new Object [n]' Grazie! –

2

Se si è chiaro() su un oggetto ArrayList, si intende ovviamente riutilizzarlo, pertanto qualsiasi riutilizzo potrebbe contenere lo stesso numero di oggetti. Quindi evitare le operazioni di ridimensionamento sembra una buona idea.

Inoltre, nudo in mente che le questioni di compilazione JIT qui, potenzialmente un sacco - che ciclo sta per essere estremamente cache di amichevoli & le singole operazioni sono molto a buon mercato - probabilmente solo una singola istruzione macchina per ogni nel caso compilato .

0

È lo stesso motivo di clear() impl in Java's LinkedList che è Java Generational Garbage Collection.

Questo ArrayList e il backing array hanno più probabilità di essere promossi alla 'vecchia generazione' dove è possibile che si aggrappino agli oggetti a cui fanno riferimento gli indici di array che sono più probabili essere nella generazione giovane. L'impostazione di tutti gli indici su null consente di raccogliere tali oggetti più giovani prima che venga raccolto l'array di backup.

Problemi correlati