Lecții din modul (2/2)
Colecții și ArrayList
Matricele tradiționale din Java au o dimensiune fixă definită în momentul creării. Pentru a lucra cu liste de date a căror dimensiune poate varia dinamic, Java oferă Java Collections Framework. Clasa cel mai des folosită este ArrayList.
Clasa ArrayList și generice
ArrayList implementează o matrice redimensionabilă în memorie. Pentru a declara un ArrayList, trebuie să specificăm tipul de elemente pe care le va conține prin includerea lui între paranteze unghiulare < >. Această caracteristică se numește Generic.
Pentru a folosi ArrayList, trebuie să îl importam la începutul fișierului din java.util.ArrayList.
Declarație și instanțiere:
import java.util.ArrayList;
ArrayList<String> shoppingList = new ArrayList<>();Metode de bază
Iată operațiunile fundamentale pe un ArrayList:
add(element): adaugă un element la sfârșitul listei.get(index): Returnează elementul la indexul specificat (0-indexat).size(): returnează numărul de elemente aflate în prezent în listă.remove(index): elimină elementul de la indexul specificat.
shoppingList.add("Pane");
shoppingList.add("Latte");
System.out.println("Elementi: " + shoppingList.size()); // Prints 2
System.out.println("Primo elemento: " + shoppingList.get(0)); // Prints "Pane"Repetarea unei liste (pentru fiecare)
Bucla for-each este structura ideală pentru a repeta prin toate elementele unei colecții:
for (String item : shoppingList) {
System.out.println(item);
}Array vs ArrayList: memorie și performanță
Deși ArrayList este mult mai flexibil decât o matrice statică, vine cu compromisuri de performanță și memorie:
- Static Array: este alocat într-un bloc de memorie contiguu, are o dimensiune fixă, iar accesarea elementelor prin index este extrem de rapidă. Stochează tipurile primitive direct, fără suprasarcină.
- ArrayList: Intern, gestionează o matrice care este redimensionată (prin crearea unei noi matrice mai mare și copierea elementelor vechi) atunci când capacitatea sa inițială (de obicei 10) este depășită. În plus, stochează doar referințe la obiecte, introducând supraîncărcare de memorie pentru fiecare element.
Autoboxing și Unboxing
Deoarece ArrayList poate deține numai obiecte, Java realizează automat conversii între tipurile primitive și clasele lor de wrapper respective:
- Autoboxing: conversie automată de la un tip primitiv la o clasă wrapper. De exemplu, când scrieți
numbers.add(42), Java convertește automat42(int) înInteger.valueOf(42)(Integer). - Unboxing: conversie automată de la o clasă wrapper la un tip primitiv. De exemplu, când executați
int num = numbers.get(0), Java convertește internIntegerînint.
Încercați-l singur
Importați ArrayList, declarați o ArrayList cu șiruri de nume denumite. Adăugați Alice și Bob la listă, apoi imprimați dimensiunea acesteia folosind metoda size().
Afișează indiciu
Includeți `import java.util.ArrayList;` în partea de sus. Creați lista cu `ArrayList<String> names = new ArrayList<>();`, adăugați elementele și imprimați dimensiunea acesteia cu `names.size()`.
Soluție disponibilă după 3 încercări
Declarați un ArrayList de numere întregi denumite, adăugați numărul 42 și imprimați-l regăsindu-l la indexul 0 folosind get().
Afișează indiciu
Folosiți `ArrayList<Integer> numere = new ArrayList<>();` (cu clasa wrapper Integer) și imprimați-o cu `System.out.println(numbers.get(0));`.
Soluție disponibilă după 3 încercări
Declarați un ArrayList de șiruri de culori numite. Adăugați culorile Roșu, Verde și Albastru la listă. În cele din urmă, utilizați o buclă pentru fiecare pentru a itera lista și a imprima fiecare culoare pe ecran.
Afișează indiciu
Declarați lista cu `ArrayList<String> colors = new ArrayList<>();`, adăugați cele trei culori și folosiți o buclă `for (String c : colors)` pentru a le imprima folosind `System.out.println(c);`.
Soluție disponibilă după 3 încercări