Модульні уроки (2/2)
Колекції та ArrayList
Традиційні масиви в Java мають фіксований розмір, визначений під час створення. Для роботи зі списками даних, розмір яких може динамічно змінюватися, Java надає Java Collections Framework. Найчастіше використовується клас ArrayList.
ArrayList Клас і загальні засоби
ArrayList реалізує в пам’яті масив змінного розміру. Щоб оголосити ArrayList, ми повинні вказати тип елементів, які він міститиме, уклавши його в кутові дужки < >. Ця функція називається Generics.
Щоб використовувати ArrayList, ми повинні імпортувати його на початку файлу з java.util.ArrayList.
Оголошення та інстанціювання:
import java.util.ArrayList;
ArrayList<String> shoppingList = new ArrayList<>();Основні методи
Ось основні операції на ArrayList:
add(element): додає елемент у кінець списку.get(index): повертає елемент із вказаним індексом (індексований 0).size(): повертає кількість елементів, які наразі знаходяться в списку.remove(index): видаляє елемент із вказаним індексом.
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 є ідеальною структурою для проходження всіх елементів колекції:
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.
Спробуйте самі
Імпортувати ArrayList, оголосити ArrayList рядків з іменами. Додайте Алісу та Боба до списку, а потім надрукуйте його розмір за допомогою методу size().
Показати підказку
Додайте `import java.util.ArrayList;` у верхній частині. Створіть список за допомогою `ArrayList<String> names = new ArrayList<>();`, додайте елементи та надрукуйте його розмір за допомогою `names.size()`.
Рішення доступне після 3 спроб
Оголошіть ArrayList цілих іменованих чисел, додайте число 42 і надрукуйте його, отримавши за індексом 0 за допомогою get().
Показати підказку
Використовуйте `ArrayList<Integer> numbers = new ArrayList<>();` (з класом-огорткою Integer) і виведіть його за допомогою `System.out.println(numbers.get(0));`.
Рішення доступне після 3 спроб
Оголошіть ArrayList String з іменованими кольорами. Додайте червоний, зелений і синій кольори до списку. Нарешті, використовуйте цикл for-each, щоб перебирати список і друкувати кожен колір на екрані.
Показати підказку
Оголошіть список за допомогою `ArrayList<String> colors = new ArrayList<>();`, додайте три кольори та використовуйте цикл `for (String c : colors)`, щоб надрукувати їх за допомогою `System.out.println(c);`.
Рішення доступне після 3 спроб