Lekcje modułu (2/2)
Kolekcje i ArrayList
Tradycyjne tablice w Javie mają stały rozmiar określany w momencie ich tworzenia. Do pracy z listami danych, których rozmiar może się dynamicznie zmieniać, Java dostarcza Framework Kolekcji (Java Collections Framework). Najczęściej używaną klasą jest ArrayList.
Klasa ArrayList i typy generyczne (Generics)
ArrayList implementuje tablicę o zmiennym rozmiarze w pamięci. Aby zadeklarować ArrayList, musimy określić typ elementów, które będzie zawierać, umieszczając go w nawiasach ostrokątnych < >. Ta funkcjonalność nazywa się typami generycznymi (Generics).
Aby użyć ArrayList, musimy zaimportować ją na początku pliku z java.util.ArrayList.
Deklaracja i tworzenie instancji:
import java.util.ArrayList;
ArrayList<String> shoppingList = new ArrayList<>();
Główne metody
Oto podstawowe operacje na ArrayList:
add(element): Dodaje element na koniec listy.get(indeks): Zwraca element o określonym indeksie (indeksowanie od 0).size(): Zwraca liczbę elementów aktualnie znajdujących się na liście.remove(indeks): Usuwa element o wskazanym indeksie.
shoppingList.add("Pane");
shoppingList.add("Latte");
System.out.println("Elementi: " + shoppingList.size()); // Stampa 2
System.out.println("Primo elemento: " + shoppingList.get(0)); // Stampa "Pane"
Przechodzenie po liście (For-Each)
Pętla for-each jest idealną strukturą do przechodzenia przez wszystkie elementy kolekcji:
for (String item : shoppingList) {
System.out.println(item);
}
Tablica vs ArrayList: pamięć i wydajność
Choć ArrayList jest znacznie bardziej elastyczna niż tablica statyczna, wiąże się z kosztami pod względem wydajności i pamięci:
- Tablica statyczna: Jest alokowana w ciągłym bloku pamięci, ma stałe wymiary, a dostęp do elementów poprzez indeks jest niezwykle szybki. Przechowuje bezpośrednio typy prymitywne bez dodatkowych kosztów (overhead).
- ArrayList: Wewnętrznie zarządza tablicą, której rozmiar jest zmieniany (poprzez utworzenie nowej, większej tablicy i skopiowanie starych elementów), gdy przekroczona zostanie jej początkowa pojemność (zwykle 10). Ponadto zawiera tylko referencje do obiektów, co wprowadza narzut pamięciowy dla każdego elementu.
Autoboxing i Unboxing
Ponieważ ArrayList może przechowywać tylko obiekty, Java automatycznie wykonuje konwersję między typami prymitywnymi a ich odpowiednimi klasami opakowującymi:
- Autoboxing: Automatyczna konwersja z typu prymitywnego na klasę opakowującą. Na przykład, gdy piszesz
numbers.add(42), Java automatycznie konwertuje42(int) naInteger.valueOf(42)(Integer). - Unboxing: Automatyczna konwersja z klasy opakowującej na typ prymitywny. Na przykład, gdy wykonujesz
int num = numbers.get(0), Java wewnętrznie wykonuje konwersję zIntegernaint.
Spróbuj sam
Zaimportuj ArrayList, zadeklaruj ArrayList obiektów String o nazwie names. Dodaj do listy Alice i Bob, a następnie wypisz jej rozmiar za pomocą metody size().
Pokaż wskazówkę
Umieść `import java.util.ArrayList;` na samej górze. Utwórz listę za pomocą `ArrayList<String> names = new ArrayList<>();`, dodaj elementy i wypisz jej rozmiar za pomocą `names.size()`.
Rozwiązanie dostępne po 3 próbach
Zadeklaruj ArrayList obiektów Integer o nazwie numbers, dodaj liczbę 42 i wypisz ją, pobierając ją za pomocą indeksu 0 metodą get().
Pokaż wskazówkę
Użyj `ArrayList<Integer> numbers = new ArrayList<>();` (z klasą opakowującą Integer) i wypisz ją za pomocą `System.out.println(numbers.get(0));`.
Rozwiązanie dostępne po 3 próbach
Zadeklaruj ArrayList obiektów String o nazwie colors. Dodaj do listy kolory Red, Green i Blue. Na koniec użyj pętli for-each, aby przejść po liście i wypisać każdy kolor na ekranie.
Pokaż wskazówkę
Zadeklaruj listę za pomocą `ArrayList<String> colors = new ArrayList<>();`, dodaj trzy kolory i użyj pętli `for (String c : colors)`, aby wypisać je za pomocą `System.out.println(c);`.
Rozwiązanie dostępne po 3 próbach