Перейти до основного вмісту
Модуль 4 · Урок 2 із 28/14 у курсі~15 min
Модульні уроки (2/2)

Колекції та ArrayList

Традиційні масиви в Java мають фіксований розмір, визначений під час створення. Для роботи зі списками даних, розмір яких може динамічно змінюватися, Java надає Java Collections Framework. Найчастіше використовується клас ArrayList.

ArrayList Клас і загальні засоби

ArrayList реалізує в пам’яті масив змінного розміру. Щоб оголосити ArrayList, ми повинні вказати тип елементів, які він міститиме, уклавши його в кутові дужки < >. Ця функція називається Generics.

Щоб використовувати ArrayList, ми повинні імпортувати його на початку файлу з java.util.ArrayList.

Оголошення та інстанціювання:

Java
import java.util.ArrayList;

ArrayList<String> shoppingList = new ArrayList<>();

Основні методи

Ось основні операції на ArrayList:

  1. add(element): додає елемент у кінець списку.
  2. get(index): повертає елемент із вказаним індексом (індексований 0).
  3. size(): повертає кількість елементів, які наразі знаходяться в списку.
  4. remove(index): видаляє елемент із вказаним індексом.
Java
shoppingList.add("Pane");
shoppingList.add("Latte");

System.out.println("Elementi: " + shoppingList.size()); // Prints 2
System.out.println("Primo elemento: " + shoppingList.get(0)); // Prints "Pane"

Ітерація по списку (для кожного)

Цикл for-each є ідеальною структурою для проходження всіх елементів колекції:

Java
for (String item : shoppingList) {
    System.out.println(item);
}

Array проти ArrayList: пам’ять і продуктивність

Хоча ArrayList є набагато гнучкішим, ніж статичний масив, він має компроміси щодо продуктивності та пам’яті:

  • Статичний масив: він розміщений у безперервному блоці пам’яті, має фіксований розмір, а доступ до елементів через індекс надзвичайно швидкий. Він зберігає примітивні типи безпосередньо без накладних витрат.
  • ArrayList: внутрішньо він керує масивом, розмір якого змінюється (шляхом створення нового більшого масиву та копіювання старих елементів), коли його початкова ємність (зазвичай 10) перевищена. Крім того, він зберігає лише посилання на об’єкти, створюючи накладні витрати пам’яті для кожного елемента.

Автопакування та розпакування

Оскільки ArrayList може зберігати лише об’єкти, Java автоматично виконує перетворення між примітивними типами та їхніми відповідними класами-огортками:

  • Autoboxing: автоматичне перетворення з примітивного типу на клас-огортку. Наприклад, коли ви пишете numbers.add(42), Java автоматично перетворює 42 (int) на Integer.valueOf(42) (Integer).
  • Розпакування: автоматичне перетворення з класу оболонки на примітивний тип. Наприклад, коли ви виконуєте int num = numbers.get(0), Java внутрішньо перетворює Integer на int.

Спробуйте самі

вправи#java.m4.l2.e1
Спроби: 0Завантаження…

Імпортувати ArrayList, оголосити ArrayList рядків з іменами. Додайте Алісу та Боба до списку, а потім надрукуйте його розмір за допомогою методу size().

Завантаження редактора…
Показати підказку

Додайте `import java.util.ArrayList;` у верхній частині. Створіть список за допомогою `ArrayList<String> names = new ArrayList<>();`, додайте елементи та надрукуйте його розмір за допомогою `names.size()`.

Рішення доступне після 3 спроб

вправи#java.m4.l2.e2
Спроби: 0Завантаження…

Оголошіть ArrayList цілих іменованих чисел, додайте число 42 і надрукуйте його, отримавши за індексом 0 за допомогою get().

Завантаження редактора…
Показати підказку

Використовуйте `ArrayList<Integer> numbers = new ArrayList<>();` (з класом-огорткою Integer) і виведіть його за допомогою `System.out.println(numbers.get(0));`.

Рішення доступне після 3 спроб

вправи#java.m4.l2.e3
Спроби: 0Завантаження…

Оголошіть ArrayList String з іменованими кольорами. Додайте червоний, зелений і синій кольори до списку. Нарешті, використовуйте цикл for-each, щоб перебирати список і друкувати кожен колір на екрані.

Завантаження редактора…
Показати підказку

Оголошіть список за допомогою `ArrayList<String> colors = new ArrayList<>();`, додайте три кольори та використовуйте цикл `for (String c : colors)`, щоб надрукувати їх за допомогою `System.out.println(c);`.

Рішення доступне після 3 спроб