Уроки модуля (2/2)
Коллекции и ArrayList
Традиционные массивы в Java имеют фиксированный размер, определенный во время создания. Для работы со списками данных, размер которых может динамически меняться, Java предоставляет Java Collections Framework. Наиболее часто используемый класс — ArrayList.
Класс ArrayList и дженерики
ArrayList реализует массив изменяемого размера в памяти. Чтобы объявить ArrayList, мы должны указать тип элементов, которые он будет содержать, заключив его в угловые скобки < >. Эта функция называется Обобщенные.
Чтобы использовать 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 автоматически выполняет преобразования между примитивными типами и соответствующими классами-оболочками:
- Автоупаковка: автоматическое преобразование примитивного типа в класс-оболочку. Например, когда вы пишете
numbers.add(42), Java автоматически преобразует42(int) вInteger.valueOf(42)(целое число). - Распаковка: автоматическое преобразование класса-оболочки в примитивный тип. Например, когда вы выполняете
int num = numbers.get(0), Java внутренне преобразуетIntegerвint.
Попробуйте сами
Импортируйте ArrayList, объявите ArrayList строковых имен. Добавьте Алису и Боба в список, затем выведите его размер с помощью метода size().
Показать подсказку
Включите `import java.util.ArrayList;` вверху. Создайте список с помощью `ArrayList<String> name = new ArrayList<>();`, добавьте элементы и напечатайте его размер с помощью `names.size()`.
Решение доступно после 3 попыток
Объявите ArrayList целочисленных именованных чисел, добавьте число 42 и распечатайте его, получив его по индексу 0 с помощью get().
Показать подсказку
Используйте `ArrayList<Integer> Numbers = new ArrayList<>();` (с классом-оболочкой Integer) и распечатайте его с помощью `System.out.println(numbers.get(0));`.
Решение доступно после 3 попыток
Объявите ArrayList строковых имен цветов. Добавьте в список цвета: красный, зеленый и синий. Наконец, используйте цикл for-each для перебора списка и вывода каждого цвета на экран.
Показать подсказку
Объявите список с помощью `ArrayList<String> flowers = new ArrayList<>();`, добавьте три цвета и используйте цикл `for (String c :colors)` для их печати с помощью `System.out.println(c);`.
Решение доступно после 3 попыток