"Iată-mă aici."

— Bună, Ellie!

"Astăzi vom vorbi despre un subiect interesant. O să vă povestesc despre clasa ArrayList ."

"O clasă nouă? Mișto! Ce poate face?"

"Permiteți-mi să încep cu povestea din spate. Singurul lucru pe care programatorilor nu le place la matrice este că nu le puteți schimba dimensiunea. Ce faceți dacă trebuie să adăugați încă trei elemente la o matrice care are doar un singur slot liber? "

„Singura soluție la această problemă este să creați matrice foarte mari, pentru a vă garanta că aveți suficient spațiu pentru toate elementele. Cu toate acestea, aceasta înseamnă adesea risipă de memorie. Dacă o matrice conține de obicei trei elemente, dar există chiar și cea mai mică șansă. că ar putea fi nevoie să găzduiască 100 de elemente, trebuie să creați o matrice de 100 de elemente.”

„Deci, cu ce au venit programatorii?”

„Au scris clasa ArrayList , care face același lucru ca un Array, dar își poate schimba dimensiunea.”

"Mișcare interesantă. Cum au făcut asta?"

„Fiecare obiect ArrayList stochează o matrice obișnuită de elemente. Când citiți elemente dintr-un ArrayList , le citește din matricea sa interioară. Când le scrieți în ArrayList , le scrie în matricea sa interioară. Aici, comparați aceste coloane:”

Matrice ArrayList
Creați un container pentru elemente
String[] list = new String[10];
ArrayList<String> list = new ArrayList<String>();
Obțineți numărul de elemente
int n = list.length;
int n = list.size();
Obțineți un element dintr-o matrice/colecție
String s = list[3];
String s = list.get(3);
Scrieți un element într-o matrice
list[3] = s;
list.set(3, s);

"Deci, de ce este mai bună ArrayList? Din câte îmi dau seama, codul este acum mai lung."

„În primul rând, ArrayList acceptă mai multe operațiuni suplimentare pe care programatorii trebuie să le efectueze tot timpul. O matrice obișnuită nu acceptă aceste operațiuni. De exemplu, inserarea sau ștergerea elementelor din mijlocul unei matrice fără a lăsa găuri.

„În al doilea rând, capacitatea de a schimba dimensiunea matricei. Când trebuie să adăugați încă un element, dar matricea internă nu are sloturi libere, iată ce se întâmplă în interiorul ArrayList :

a) Se creează o altă matrice care este cu 50% mai mare decât matricea interioară actuală, plus un element.

b) Toate elementele din matricea veche sunt copiate în cel nou.

c) Noua matrice este salvată ca matrice internă a obiectului ArrayList. Vechea matrice este declarată gunoi (pur și simplu nu mai stocăm o referință la el)."

Matrice ArrayList
Adăugați un element la sfârșitul matricei
Această acțiune nu este acceptată
list.add(s);
Adăugați un element în mijlocul matricei
Această acțiune nu este acceptată
list.add(15, s);
Adăugați un element la începutul matricei
Această acțiune nu este acceptată
list.add(0, s);
Ștergeți un element din matrice
Am putea șterge un element cu list[3] = null. Dar asta ar lăsa o „gaură” în matrice.
list.remove(3);

„Cum lucrăm cu această ArrayList?”

„De fapt, la fel cum facem cu o matrice obișnuită. Uite. Să comparăm lucrul cu un ArrayList cu lucrul cu o matrice. Să presupunem că trebuie să „citim în 10 șiruri și să le afișăm pe ecran în ordine inversă ”.

"Uita-te la asta:

Cu o matrice
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// Read strings from the keyboard
String[] list = new String[10];
for (int i = 0; i < list.length; i++)
{
  String s = reader.readLine();
  list[i] = s;
}

// Display the contents of the array
for (int i = 0; i < list.length; i++)
{
  int j = list.length - i - 1;
  System.out.println( list[j] );
}
}
Cu un ArrayList
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// Read strings from the keyboard
ArrayList&ltString> list = new ArrayList&ltString>();
for (int i = 0; i < 10; i++)
{
  String s = reader.readLine();
  list.add(s);
}

// Display the contents of the collection
for (int i = 0; i < list.size(); i++)
{
  int j = list.size() - i - 1;
  System.out.println( list.get(j) );
}
}

Am folosit aceeași culoare pentru a evidenția acțiuni similare în fiecare coloană.”

"Pe de o parte, totul este diferit. Pe de altă parte, este încă la fel."

"Corect. Cu excepția faptului că nu folosim paranteze pătrate atunci când lucrăm cu o ArrayList . În schimb, folosim metode get , set și add ."

"Da, am adunat atât de mult. Totuși, arată foarte mult la fel."