1. Come ArrayListè strutturato
ArrayListè la classe Java utilizzata più comunemente per la memorizzazione di elementi. Allora come ArrayListfunziona e perché piace così tanto a tutti?
La struttura di ArrayListè semplice e geniale. Ogni ArrayListoggetto contiene due campi:
- Una matrice di elementi
- Una
sizevariabile, che memorizza il numero di elementi nell'elenco
Internamente, un ArrayListoggetto contiene un array molto comune! Ma non è tutto. C'è anche una variabile size , che memorizza la lunghezza dell'elenco. Ecco come funziona:
Inizialmente, la lunghezza dell'array all'interno dell'elenco è 10. E la sizevariabile è 0.
Se aggiungi un elemento all'elenco, verrà memorizzato nella cella 0 dell'array e sizeaumenterà a 1.
Se aggiungi un altro elemento, verrà memorizzato nella prima cella e sizeaumenterà nuovamente di 1 e diventerà uguale a due.
Se aggiungi un altro elemento quando non c'è più spazio nell'array, nel add()metodo accade quanto segue:
- Viene creato un nuovo array che è una volta e mezza la lunghezza del precedente
- Tutti gli elementi del vecchio array vengono copiati nel nuovo array.
- Nell'oggetto
ArrayList, un riferimento al nuovo array sostituisce il riferimento a quello vecchio . - L'elemento passato viene salvato nella decima cella del nuovo array.
- La variabile dimensione aumenta di 1 e sarà ora uguale a 11
Qualcosa di simile accade quando si aggiunge (inserisce) un elemento al centro dell'elenco. Gli elementi esistenti vengono spostati di 1 a destra e l'elemento passato viene scritto nella cella appena liberata dell'array.
Ora considereremo gli scenari più basilari che coinvolgono gli elenchi:
2. Aggiunta di un elemento a un fileArrayList
Diamo un'occhiata a cosa succede all'interno dell'elenco quando gli elementi vengono aggiunti ad esso. Immediatamente dopo la creazione di un oggetto ArrayList, abbiamo qualcosa di simile in memoria:

Abbiamo un ArrayListoggetto che contiene due campi (due variabili): un contenitore (l' dataarray) e il numero di elementi memorizzati ( size). La datavariabile memorizza un riferimento a un contenitore (array) che può memorizzare 10 elementi.
Se decidiamo di aggiungere il numero 5 all'array, otteniamo la seguente immagine:

L'array ora memorizza l'elemento 5 e size == 1.
Se qualcuno chiama ora il size()metodo sul nostro ArrayListoggetto, il valore restituito sarà il numero di elementi memorizzati nell'elenco: 1. Il numero di elementi nell'elenco non è uguale alla capacità di archiviazione dell'array.
Né l'attuale capacità di archiviazione né l'array stesso saranno mai accessibili (visibili) all'esterno dell'oggetto ArrayList. Questi sono e saranno sempre i ArrayListdati interni di .
Aggiungiamo altri 7 numeri all'elenco: 10, 20, 30, 40, 50, 60, 70.
Ora la memoria sarà simile a questa:

Se chiami il size()metodo ora, restituirà il numero 8, che è il nuovo numero di elementi nell'elenco. Questo valore non ha nulla a che fare con la dimensione dell'array interno.
C'è una semplificazione eccessiva in questa immagine.
La ArrayListclasse non può memorizzare tipi primitivi, quindi utilizza il Integertipo anziché int. Il contenitore non memorizza direttamente i valori {5, 10, 20, 30, 40, 50, 60, 70}, ma piuttosto i riferimenti agli Integeroggetti. Tutte le celle vuote nell'archivio container null.
3. Aumentare la lunghezza di un elenco
Diamo un'occhiata a cosa succede all'interno di una lista quando non ci sono più celle vuote nel suo array interno.
Supponiamo di avere una lista di 10 elementi:

Decidiamo di aggiungervi il numero 100 . Questo è ciò che accade nel add()metodo:
Passaggio 1: crea un nuovo array:

Passaggio 2: copia tutti gli elementi dal vecchio array a quello nuovo:

Passaggio 3 — Sostituisci il vecchio array (cambia il riferimento all'array ArrayListinterno dell'oggetto):

Passaggio 4: aggiungi il nuovo numero, che è ciò per cui abbiamo lavorato così duramente:

GO TO FULL VERSION