ArrayList: список в Java
ArrayList — список, который растёт сам: в отличие от массива, размер заранее указывать не нужно. Он лежит в пакете java.util.
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("молоко");
list.add("хлеб");
list.add("сыр");
System.out.println(list);
System.out.println(list.size());
System.out.println(list.get(1));
list.set(1, "батон");
list.remove("молоко");
System.out.println(list);
System.out.println(list.contains("сыр"));
for (String item : list) {
System.out.println("- " + item);
}
}
}[молоко, хлеб, сыр]
3
хлеб
[батон, сыр]
true
- батон
- сырList<String> — список строк: тип элементов пишут в угловых скобках. Справа new ArrayList<>() — скобки <> пустые, тип компилятор возьмёт слева. Слева обычно пишут интерфейс List, а не ArrayList: так проще потом заменить вид списка. Список выводится через println сразу в виде [a, b, c], без Arrays.toString.
Основные методы
| Метод | Что делает |
|---|---|
add(x) | добавляет в конец |
add(i, x) | вставляет на место i, остальные сдвигаются |
get(i) | элемент с номером i (с нуля) |
set(i, x) | заменяет элемент с номером i |
remove(i) | удаляет по номеру |
remove(x) | удаляет первое вхождение значения |
size() | число элементов |
contains(x) | есть ли значение в списке |
indexOf(x) | номер первого вхождения или −1 |
isEmpty() | пуст ли список |
clear() | удаляет всё |
Список чисел
Для чисел пишут List<Integer>, а не List<int>: в угловых скобках может быть только класс. Числа упаковываются в Integer сами. Осторожно с remove: у List<Integer> вызов remove(1) удаляет элемент с номером 1, а не число 1 — подробно в справке int и Integer.
Удаление в цикле
Удалять элементы прямо в цикле for-each нельзя — программа упадёт с ConcurrentModificationException. Удалить всё, что подходит под условие, удобнее через removeIf:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> nums = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6));
nums.removeIf(n -> n % 2 == 0);
System.out.println(nums);
}
}[1, 3, 5]n -> n % 2 == 0 — лямбда, короткая запись правила: «для элемента n — истина, если он чётный».
Подводные камни
List.of(…)неизменяем.List.of("a", "b")создаёт готовый список, ноaddиremoveу него выбрасываютUnsupportedOperationException. Нужен изменяемый — оберните:new ArrayList<>(List.of("a", "b")).IndexOutOfBoundsException—get(i)с номером отsize()и больше. Последний элемент —list.get(list.size() - 1).- Сравнение списков —
a.equals(b): истина, если элементы одинаковые и в том же порядке. - Сортировка —
Collections.sort(list)илиlist.sort(…), справка Как отсортировать массив или список. - Поиск по значению в большом списке (
contains,indexOf) просматривает элементы по одному. Если нужно часто проверять наличие или искать по ключу, лучше подходятHashSetиHashMap(справка HashMap: словарь в Java).