1. Cum ArrayListeste structurat

ArrayListeste 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 ArrayListeste simplă și ingenioasă. Fiecare ArrayListobiect conține două câmpuri:

  • O serie de elemente
  • O sizevariabilă, care stochează numărul de elemente din listă

În interior, un ArrayListobiect 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 sizevariabila este 0.

Dacă adăugați un element în listă, acesta va fi stocat în celula 0 a matricei și sizeva crește la 1.

Dacă adăugați încă un element, acesta va fi stocat în prima celulă și sizeva 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():

  1. Este creată o nouă matrice care are o lungime de o dată și jumătate față de cea anterioară
  2. Toate elementele vechiului tablou sunt copiate în noua matrice.
  3. În ArrayListobiect, o referință la noua matrice înlocuiește referința la cea veche .
  4. Elementul trecut este salvat în a 10-a celulă a noii matrice.
  5. 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:

Adăugarea unui element la o ArrayList

Avem un ArrayListobiect care conține două câmpuri (două variabile): un container (matricea data) și numărul de elemente stocate ( size). Variabila datastochează 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:

Adăugarea unui element la o ArrayList 2

Matricea stochează acum elementul 5 și size == 1.

Dacă cineva apelează acum size()metoda pe ArrayListobiectul 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 ArrayListdatele 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:

Adăugarea unui element la o ArrayList

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.

Important:

Există o simplificare excesivă în această imagine.

Clasa ArrayListnu poate stoca tipuri primitive, așa că folosește Integertipul mai degrabă decât int. Containerul nu stochează direct valorile {5, 10, 20, 30, 40, 50, 60, 70}, ci mai degrabă referințe la Integerobiecte. 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:

Mărirea lungimii unei liste

Decidem să adăugăm numărul 100 . Iată ce se întâmplă în add()metoda:

Pasul 1 - Creați o nouă matrice:

Mărirea lungimii unei liste 2

Pasul 2 - Copiați toate elementele din vechea matrice în cea nouă:

Mărirea lungimii unei liste 2

Pasul 3 — Înlocuiți matricea veche (schimbați referința la ArrayListmatricea internă a obiectului):

Mărirea lungimii unei liste 3

Pasul 4 — Adăugați noul număr, ceea ce am muncit atât de mult pentru a realiza:

Mărirea lungimii unei liste 4