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:

  1. Viene creato un nuovo array che è una volta e mezza la lunghezza del precedente
  2. Tutti gli elementi del vecchio array vengono copiati nel nuovo array.
  3. Nell'oggetto ArrayList, un riferimento al nuovo array sostituisce il riferimento a quello vecchio .
  4. L'elemento passato viene salvato nella decima cella del nuovo array.
  5. 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:

Aggiunta di un elemento a un ArrayList

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:

Aggiunta di un elemento a un ArrayList 2

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:

Aggiunta di un elemento a un ArrayList

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.

Importante:

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:

Aumentare la lunghezza di un elenco

Decidiamo di aggiungervi il numero 100 . Questo è ciò che accade nel add()metodo:

Passaggio 1: crea un nuovo array:

Aumentare la lunghezza di una lista 2

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

Aumentare la lunghezza di una lista 2

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

Aumentare la lunghezza di una lista 3

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

Aumentare la lunghezza di una lista 4