ArrayList
ArrayList — это список, который сам растёт. Обычный массив надо создавать сразу нужного размера, а в ArrayList можно докидывать элементы сколько угодно — он сам расширяется. Это коллекция №1: на работе ты будешь использовать её чаще всего.
Как это в коде
List<String> names = new ArrayList<>();
names.add("Аня"); // добавили
names.add("Борис");
names.get(0); // "Аня" — берём по номеру
names.size(); // 2 — сколько элементов
Запомнить на старте:
- в угловых скобках
<String>пишешь, что хранишь — текст, числа, объекты; - нумерация с нуля: первый элемент —
get(0); - порядок добавления сохраняется — что добавил первым, то и будет первым.
Копнуть глубже — как на работе
Обычно объявляют переменную как List (интерфейс), а создают как ArrayList (реализация):
List<String> names = new ArrayList<>();
Так код не привязан к конкретной реализации — завтра сможешь заменить на LinkedList, не переписывая остальное. Перебирают список чаще всего через for-each:
for (String n : names) {
System.out.println(n);
}
Удалять элементы прямо во время такого цикла нельзя — получишь ConcurrentModificationException.
Под капотом — для глубокого понимания
Внутри ArrayList — обычный массив. Когда он заполняется, создаётся новый массив в ~1.5 раза больше и старые элементы копируются. Поэтому:
get(i)по индексу — O(1), мгновенно;add()в конец — в среднем O(1), но иногда дороже из-за расширения;add/removeв середину — O(n): надо сдвигать хвост.
Если вставок в середину много — там, где это критично, выбирают LinkedList. Если знаешь итоговый размер заранее — задай его в конструкторе (new ArrayList<>(1000)), чтобы избежать лишних копирований.
• почему нумерация с нуля;
• почему вставка в середину медленнее, чем в конец (если дошёл до 3-го слоя).