Все темы / Коллекции / ArrayList

ArrayList

ArrayList — это список, который сам растёт. Обычный массив надо создавать сразу нужного размера, а в ArrayList можно докидывать элементы сколько угодно — он сам расширяется. Это коллекция №1: на работе ты будешь использовать её чаще всего.

Как это в коде

List<String> names = new ArrayList<>();
names.add("Аня");        // добавили
names.add("Борис");
names.get(0);            // "Аня" — берём по номеру
names.size();            // 2 — сколько элементов

Запомнить на старте:

Копнуть глубже — как на работе

Обычно объявляют переменную как 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)), чтобы избежать лишних копирований.

🎤 Закрыл тему, если можешь объяснить:
• чем ArrayList отличается от обычного массива;
• почему нумерация с нуля;
• почему вставка в середину медленнее, чем в конец (если дошёл до 3-го слоя).
← к теме