1. Jak to działaArrayList
ArrayListjest najczęstszą klasą w Javie do przechowywania elementów. Więc jak to działa ArrayListi dlaczego wszyscy tak bardzo to lubią?
Urządzenie ArrayListjest proste i genialne w swojej istocie. Wewnątrz każdego obiektu ArrayListznajdują się dwa pola:
- Tablica z listą elementów
- Zmienna
sizeprzechowująca liczbę elementów na liście
Wewnątrz obiektu ArrayListznajduje 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 sizeto 0.
Jeśli element zostanie dodany do listy, zostanie zapisany w 0-tej komórce tablicy i sizewzrośnie do 1.
Jeśli dodasz kolejny element, zostanie on zapisany w pierwszej komórce i sizeponownie 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
ArrayListtablicy 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). dataprzechowuje 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 ArrayListi 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 ArrayListnie może przechowywać typów pierwotnych, więc zamiast typu intuż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