La capacità di un ArrayList rispetto alla dimensione di un array in Java

1. Panoramica

Java ci consente di creare array di dimensioni fisse o utilizzare classi di raccolta per svolgere un lavoro simile.

In questo tutorial, esamineremo la differenza tra la capacità di un ArrayList e la dimensione di un Array.

Vedremo anche esempi di quando dovremmo inizializzare ArrayList con una capacità e i vantaggi e gli svantaggi in termini di utilizzo della memoria.

2. Esempio

Per capire le differenze, proviamo prima entrambe le opzioni.

2.1. Dimensioni di un array

In java, è obbligatorio specificare la dimensione di un array durante la creazione di una nuova istanza di esso:

Integer[] array = new Integer[100]; System.out.println("Size of an array:" + array.length);

Qui, abbiamo creato un I nteger array di dimensione 100, che ha portato alla produzione di seguito

Dimensione di un array: 100

2.2. Capacità di un ArrayList

Ora creiamo un ArrayList con una capacità iniziale di 100:

List list = new ArrayList(100); System.out.println("Size of the list is :" + list.size());
La dimensione dell'elenco è: 0

Poiché non sono stati ancora aggiunti elementi, la dimensione è zero.

Ora, aggiungiamo un elemento all'elenco e controlliamo la dimensione di esso:

list.add(10); System.out.println("Size of the list is :" + list.size());
La dimensione dell'elenco è: 1

3. Dimensione in array rispetto a ArrayList

Di seguito sono riportate alcune differenze principali tra la dimensione di un array e la capacità di un ArrayList.

3.1. Modifica delle dimensioni

Gli array hanno dimensioni fisse. Una volta inizializzato l'array con un valore int come dimensione, non può cambiare. Anche le dimensioni e la capacità sono uguali.

Le dimensioni e la capacità di ArrayList non sono fisse. La dimensione logica dell'elenco cambia in base all'inserimento e alla rimozione di elementi al suo interno. Questo viene gestito separatamente dalle dimensioni di archiviazione fisica. Inoltre, quandoviene raggiuntala soglia dicapacitàdi ArrayList , aumenta la sua capacità di fare spazio a più elementi.

3.2. Allocazione della memoria

La memoria array viene allocata durante la creazione. Quando inizializziamo un array, alloca la memoria in base alla dimensione e al tipo di un array. Inizializza tutti gli elementi con un valore null per i tipi di riferimento e il valore predefinito per i tipi primitivi.

ArrayList cambia l'allocazione della memoria man mano che cresce. Quando specifichiamo la capacità durante l'inizializzazione di ArrayList , alloca memoria sufficiente per archiviare oggetti fino a quella capacità. La dimensione logica rimane 0. Quando è il momento di espandere la capacità, viene creato un nuovo array più grande e i valori vengono copiati in esso.

Dobbiamo notare che esiste uno speciale array singleton di dimensione 0 per oggetti ArrayList vuoti , il che li rende molto economici da creare. Vale anche la pena notare che ArrayList utilizza internamente un array di riferimenti a oggetti.

4. Quando inizializzare ArrayList con capacità

Potremmo aspettarci di inizializzare la capacità di un ArrayList quando conosciamo la sua dimensione richiesta prima di crearlo, ma di solito non è necessario. Tuttavia, ci sono alcuni motivi per cui questa potrebbe essere l'opzione migliore.

4.1. Costruire un Large ArrayList

È bene inizializzare un elenco con una capacità iniziale quando sappiamo che diventerà grande. Ciò impedisce alcune costose operazioni di crescita man mano che aggiungiamo elementi.

Allo stesso modo, se l'elenco è molto grande, le operazioni di crescita automatica possono allocare più memoria del necessario per la dimensione massima esatta. Questo perché l'importo da aumentare ogni volta viene calcolato come proporzione della dimensione fino a quel momento. Quindi, con elenchi di grandi dimensioni, ciò potrebbe comportare uno spreco di memoria.

4.2. Creazione di Small Multiple ArrayList s

Se abbiamo molte piccole raccolte, la capacità automatica di un ArrayList potrebbe fornire una grande percentuale di memoria sprecata. Diciamo che ArrayList preferisce una dimensione di 10 con un numero inferiore di elementi, ma stiamo memorizzando solo 2 o 3. Ciò significa che il 70% di memoria sprecata, il che potrebbe avere importanza se abbiamo un numero enorme di questi elenchi.

L'impostazione anticipata della capacità può evitare questa situazione.

5. Evitare gli sprechi

Dobbiamo notare che ArrayList è una buona soluzione per un contenitore di oggetti di dimensioni flessibili che deve supportare l'accesso casuale. Consuma una quantità di memoria leggermente superiore rispetto a un array, ma fornisce un set di operazioni più ricco.

In alcuni casi d'uso, soprattutto intorno a grandi raccolte di valori primitivi, l'array standard potrebbe essere più veloce e utilizzare meno memoria.

Allo stesso modo, per memorizzare un numero variabile di elementi a cui non è necessario accedere tramite indice, LinkedList può essere più performante. Non viene fornito con alcun sovraccarico di gestione della memoria.

6. Riepilogo

In questo breve articolo, abbiamo visto la differenza tra la capacità di ArrayList e la dimensione di un array. Abbiamo anche esaminato quando dovremmo inizializzare ArrayList con capacità e i suoi vantaggi in termini di utilizzo della memoria e prestazioni.

Come sempre, il codice di esempio è disponibile su GitHub.