2010-11-13 3 views

risposta

31

E ' la capacità iniziale, ovvero il numero di articoli che ArrayList assegnerà all'inizio come memoria interna degli articoli.

ArrayList può contenere "qualsiasi numero di elementi" (a patto di avere la memoria per esso) e quando fare grandi inserimenti iniziali si può dire ArrayList di allocare una memoria più grande per cominciare per non sprecare cicli di CPU quando si tenta allocare più spazio per il prossimo oggetto.

Esempio:

ArrayList list = new ArrayList<Integer>(2); 
list.add(1); // size() == 1 
list.add(2); // size() == 2, list is "filled" 
list.add(3); // size() == 3, list is expanded to make room for the third element 
+0

cosa significa? e qual è il vantaggio di ciò? –

+0

gr8 risponde grazie mille :), adoro lo stackoverflow !!! –

+3

Mi oppongo alla parola "default" nella prima frase. Il numero * predefinito * è la dimensione assegnata se * non * si inserisce un numero tra parentesi. –

7

In pratica, si tratta di quanti elementi è possibile aggiungere al ArrayList prima che ridimensiona in background, che può risparmiare alcuni cicli se usato correttamente.

5

La capacità è la dimensione della memoria interna degli oggetti. La memoria interna è sempre maggiore o uguale alla dimensione() della lista (in modo che possa contenere tutti gli elementi).

public class Main { 
    public static void main(String[] args) throws Exception { 

     ArrayList<Integer> arr = new ArrayList<>(); 
     System.out.println("initial size = " + arr.size()); // 0 
     System.out.println("initial capacity = " + getCapacity(arr)); 

     for (int i = 0; i < 11; i++) 
      arr.add(i); 

     System.out.println("size = " + arr.size()); // 11 
     System.out.println("capacity = " + getCapacity(arr)); 
    } 

    static int getCapacity(ArrayList<?> l) throws Exception { 
     Field dataField = ArrayList.class.getDeclaredField("elementData"); 
     dataField.setAccessible(true); 
     return ((Object[]) dataField.get(l)).length; 
    } 
} 

esecuzione questo dà:

initial size = 0 
initial capacity = 10 
size = 11 
capacity = 16 
2

Sotto il cofano, ArrayList è essenzialmente un dynamic array. Ogni volta che si crea un'istanza usando new Arraylist<>() Quello che sta succedendo è che una matrice viene creato per contenere i valori che si desidera memorizzare la cui capacità, not to be confused with size di default, è 10.

Ogni volta che si aggiunge un valore che farebbe aumentare la dimensione oltre la capacità di un nuovo viene creato un array con una capacità superiore al 150% rispetto alla capacità precedente con i contenuti dell'array precedente copiati all'interno.

Se si ha un'idea generale di quali dimensioni sarà la lista risultante, o si è certi ma si desidera la flessibilità offerta dall'uso di arraylist su array, è possibile impostare la capacità di impedire questo processo ripetitivo di creazione di nuovi array, copiando il contenuto di il vecchio array nel nuovo, e sbarazzarsi di quello vecchio - che altrimenti aumenterà in casi proporzionali alla dimensione della lista.