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():

  1. nowa tablica jest tworzona półtora raza dłuższa niż poprzednia
  2. wszystkie elementy z istniejącej tablicy są do niej kopiowane
  3. obiekt zachowuje odniesienie do nowejArrayList tablicy zamiast starej tablicy .
  4. Przekazany element jest zapisywany w 10. komórce nowej tablicy
  5. 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:

Dodawanie elementu do ArrayList

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:

Dodawanie elementu do ArrayList

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:

Dodanie elementu do ArrayList 2

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.

Ważny:

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:

Zwiększanie długości listy

Postanowiliśmy dodać do niej liczbę 100 i oto co dzieje się w metodzie add():

Krok 1 - tworzenie nowej tablicy:

Zwiększanie długości listy 1

Krok 2 - skopiowanie wszystkich elementów ze starej tablicy do nowej:

Zwiększanie długości listy

Krok 3 - zamiana tablicy (zmiana odwołania do tablicy wewnątrz obiektu ArrayList):

Zwiększanie długości listy 3

Krok 4 - dodanie nowego numeru, o który tak bardzo się staraliśmy:

Zwiększanie długości listy 4