1. Come ArrayList
è strutturato
ArrayList
è la classe Java utilizzata più comunemente per la memorizzazione di elementi. Allora come ArrayList
funziona e perché piace così tanto a tutti?
La struttura di ArrayList
è semplice e geniale. Ogni ArrayList
oggetto contiene due campi:
- Una matrice di elementi
- Una
size
variabile, che memorizza il numero di elementi nell'elenco
Internamente, un ArrayList
oggetto 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 size
variabile è 0.
Se aggiungi un elemento all'elenco, verrà memorizzato nella cella 0 dell'array e size
aumenterà a 1.
Se aggiungi un altro elemento, verrà memorizzato nella prima cella e size
aumenterà 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 ArrayList
oggetto che contiene due campi (due variabili): un contenitore (l' data
array) e il numero di elementi memorizzati ( size
). La data
variabile 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 ArrayList
oggetto, 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 ArrayList
dati 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 ArrayList
classe non può memorizzare tipi primitivi, quindi utilizza il Integer
tipo anziché int
. Il contenitore non memorizza direttamente i valori {5, 10, 20, 30, 40, 50, 60, 70}, ma piuttosto i riferimenti agli Integer
oggetti. 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 ArrayList
interno dell'oggetto):
Passaggio 4: aggiungi il nuovo numero, che è ciò per cui abbiamo lavorato così duramente:
GO TO FULL VERSION