1. Jak to działaArrayList
ArrayList
jest najczęstszą klasą w Javie do przechowywania elementów. Więc jak to działa ArrayList
i dlaczego wszyscy tak bardzo to lubią?
Urządzenie ArrayList
jest proste i genialne w swojej istocie. Wewnątrz każdego obiektu ArrayList
znajdują się dwa pola:
- Tablica z listą elementów
- Zmienna
size
przechowująca liczbę elementów na liście
Wewnątrz obiektu ArrayList
znajduje się najczęściej spotykana tablica! Ale nie tylko. Istnieje również zmienna rozmiaru , która przechowuje długość listy. Oto jak to działa:
Początkowo długość tablicy wewnątrz listy wynosi 10 elementów. A zmienna size
to 0.
Jeśli element zostanie dodany do listy, zostanie zapisany w 0-tej komórce tablicy i size
wzrośnie do 1.
Jeśli dodasz kolejny element, zostanie on zapisany w pierwszej komórce i size
ponownie powiększony o 1, a teraz równy dwa.
Jeśli podczas dodawania kolejnego elementu do listy w tablicy zabraknie miejsca, w metodzie dzieje się tak add()
:
- nowa tablica jest tworzona półtora raza dłuższa niż poprzednia
- wszystkie elementy z istniejącej tablicy są do niej kopiowane
- obiekt zachowuje odniesienie do nowej
ArrayList
tablicy zamiast starej tablicy . - Przekazany element jest zapisywany w 10. komórce nowej tablicy
- rozmiar zostanie zwiększony o 1 i będzie teraz równy 11
Podobnie przy dodawaniu (wstawianiu) elementu na środku listy. Istniejące elementy są przesuwane o 1 w prawo, a wymagany element jest zapisywany w wolnej komórce tablicy.
Rozważymy teraz najbardziej podstawowe scenariusze korzystania z listy:
2. Dodanie elementu doArrayList
Przyjrzyjmy się, co dzieje się wewnątrz listy po dodaniu do niej elementów. Zaraz po utworzeniu obiektu ArrayList mamy w pamięci coś takiego:
Mamy obiekt typu ArrayList
, wewnątrz którego znajdują się dwa pola (dwie zmienne): tablica ( data
) i liczba elementów ( size
). data
przechowuje odniesienie do kontenera (tablicy) 10 elementów.
Jeśli zdecydujemy się dodać do tablicy liczbę 5, otrzymamy następujący obraz:
Tablica zawiera teraz element 5 i zmienną size == 1
.
Jeśli teraz ktoś wywoła metodę size()
na naszym obiekcie ArrayList
, otrzyma liczbę elementów listy - 1. Liczba elementów listy nie jest wielkością tablicy.
Ani rzeczywisty rozmiar tablicy, ani sama tablica nigdy nie będą dostępne (widoczne) poza plikiem ArrayList
. To są dane wewnętrzne ArrayList
i zawsze tak pozostanie.
Dodajmy jeszcze 7 liczb do listy: 10, 20, 30, 40, 50, 60, 70.
Wtedy obraz w pamięci będzie wyglądał tak:
Jeśli metoda zostanie wywołana now size()
, zwróci liczbę 8, czyli nową liczbę elementów na liście. Nie ma to nic wspólnego z wielkością tablicy.
Na tym zdjęciu jest jedna nieścisłość.
Klasa ArrayList
nie może przechowywać typów pierwotnych, więc zamiast typu int
używa Integer
. Kontener nie przechowuje wartości 5-70, ale odniesienia do obiektów typu Integer
. Wszystkie puste komórki kontenera przechowują pliki null
.
3. Zwiększenie długości listy
Przyjrzyjmy się, co dzieje się wewnątrz listy, gdy w tablicy skończą się wolne komórki.
Powiedzmy, że mamy listę 10 elementów:
Postanowiliśmy dodać do niej liczbę 100 i oto co dzieje się w metodzie add()
:
Krok 1 - tworzenie nowej tablicy:
Krok 2 - skopiowanie wszystkich elementów ze starej tablicy do nowej:
Krok 3 - zamiana tablicy (zmiana odwołania do tablicy wewnątrz obiektu ArrayList
):
Krok 4 - dodanie nowego numeru, o który tak bardzo się staraliśmy:
GO TO FULL VERSION