1. Cum ArrayList
este structurat
ArrayList
este clasa Java folosită cel mai frecvent pentru stocarea elementelor. Deci, cum funcționează ArrayList
și de ce le place tuturor atât de mult?
Structura ArrayList
este simplă și ingenioasă. Fiecare ArrayList
obiect conține două câmpuri:
- O serie de elemente
- O
size
variabilă, care stochează numărul de elemente din listă
În interior, un ArrayList
obiect conține o matrice obișnuită! Dar asta nu este tot. Există, de asemenea, o variabilă de dimensiune , care stochează lungimea listei. Asa functioneaza:
Inițial, lungimea matricei din lista este 10. Iar size
variabila este 0.
Dacă adăugați un element în listă, acesta va fi stocat în celula 0 a matricei și size
va crește la 1.
Dacă adăugați încă un element, acesta va fi stocat în prima celulă și size
va crește din nou cu 1 și va deveni egal cu doi.
Dacă adăugați un alt element când nu mai există spațiu în matrice, atunci se întâmplă următoarele în metodă add()
:
- Este creată o nouă matrice care are o lungime de o dată și jumătate față de cea anterioară
- Toate elementele vechiului tablou sunt copiate în noua matrice.
- În
ArrayList
obiect, o referință la noua matrice înlocuiește referința la cea veche . - Elementul trecut este salvat în a 10-a celulă a noii matrice.
- Variabila dimensiune crește cu 1 și va fi acum egală cu 11
Ceva similar se întâmplă atunci când adăugați (inserați) un element în mijlocul listei. Elementele existente sunt deplasate cu 1 la dreapta, iar elementul trecut este scris în celula nou eliberată a matricei.
Acum vom lua în considerare cele mai de bază scenarii care implică liste:
2. Adăugarea unui element la unArrayList
Să aruncăm o privire la ceea ce se întâmplă în listă atunci când elementele sunt adăugate la ea. Imediat după ce este creat un obiect ArrayList, avem ceva de genul acesta în memorie:
Avem un ArrayList
obiect care conține două câmpuri (două variabile): un container (matricea data
) și numărul de elemente stocate ( size
). Variabila data
stochează o referință la un container (matrice) care poate stoca 10 elemente.
Dacă decidem să adăugăm numărul 5 la matrice, obținem următoarea imagine:
Matricea stochează acum elementul 5 și size == 1
.
Dacă cineva apelează acum size()
metoda pe ArrayList
obiectul nostru, valoarea returnată va fi numărul de elemente stocate în listă: 1. Numărul de elemente din listă nu este același cu capacitatea de stocare a matricei.
Nici capacitatea de stocare curentă, nici matricea în sine nu vor fi vreodată accesibile (vizibile) în afara obiectului ArrayList
. Acestea sunt și vor fi întotdeauna ArrayList
datele interne ale lui.
Să adăugăm încă 7 numere pe listă: 10, 20, 30, 40, 50, 60, 70.
Acum memoria va arăta astfel:
Dacă apelați size()
metoda acum, aceasta va returna numărul 8, care este noul număr de elemente din listă. Această valoare nu are nimic de-a face cu dimensiunea matricei interne.
Există o simplificare excesivă în această imagine.
Clasa ArrayList
nu poate stoca tipuri primitive, așa că folosește Integer
tipul mai degrabă decât int
. Containerul nu stochează direct valorile {5, 10, 20, 30, 40, 50, 60, 70}, ci mai degrabă referințe la Integer
obiecte. Toate celulele goale din depozitul de containere null
.
3. Mărirea lungimii unei liste
Să aruncăm o privire la ce se întâmplă în interiorul unei liste atunci când nu mai există celule goale în matricea sa internă.
Să presupunem că avem o listă de 10 elemente:
Decidem să adăugăm numărul 100 . Iată ce se întâmplă în add()
metoda:
Pasul 1 - Creați o nouă matrice:
Pasul 2 - Copiați toate elementele din vechea matrice în cea nouă:
Pasul 3 — Înlocuiți matricea veche (schimbați referința la ArrayList
matricea internă a obiectului):
Pasul 4 — Adăugați noul număr, ceea ce am muncit atât de mult pentru a realiza: