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

Коллекции и ArrayList

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

Класс ArrayList и дженерики

ArrayList реализует массив изменяемого размера в памяти. Чтобы объявить ArrayList, мы должны указать тип элементов, которые он будет содержать, заключив его в угловые скобки < >. Эта функция называется Обобщенные.

Чтобы использовать 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 автоматически выполняет преобразования между примитивными типами и соответствующими классами-оболочками:

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

Попробуйте сами

Упражнение#java.m4.l2.e1
Попыток: 0Загрузка…

Импортируйте ArrayList, объявите ArrayList строковых имен. Добавьте Алису и Боба в список, затем выведите его размер с помощью метода size().

Загрузка редактора…
Показать подсказку

Включите `import java.util.ArrayList;` вверху. Создайте список с помощью `ArrayList<String> name = 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 строковых имен цветов. Добавьте в список цвета: красный, зеленый и синий. Наконец, используйте цикл for-each для перебора списка и вывода каждого цвета на экран.

Загрузка редактора…
Показать подсказку

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

Решение доступно после 3 попыток