← Назад к вопросам

Все ли реализации List можно назвать прокачанным массивом

2.0 Middle🔥 171 комментариев
#Коллекции#ООП#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Все ли реализации List можно назвать прокачанным массивом

Нет, не все реализации List можно назвать «прокачанным массивом». Хотя ArrayList действительно основана на массиве, другие реализации имеют совершенно другую структуру и поведение.

ArrayList — прокачанный массив

ArrayList — это действительно динамический массив с автоматическим расширением:

List<String> list = new ArrayList<>();
list.add("A");  // Добавляется в массив
list.add("B");  // При переполнении создаётся новый массив
list.get(0);    // O(1) — прямой доступ по индексу
list.remove(0); // O(n) — нужно сдвинуть элементы

Характеристики:

  • Основана на обычном Java массиве
  • Быстрый доступ по индексу: O(1)
  • Медленное удаление/вставка: O(n)
  • Возрастающий размер при переполнении (обычно ×1.5)

LinkedList — совсем другая структура

LinkedList основана на двусвязном списке, а не на массиве:

List<String> list = new LinkedList<>();
list.add("A");     // Создаёт новый Node
list.get(0);       // O(n) — нужно пройти по цепочке
list.remove(0);    // O(1) — удаляем указатели
list.addFirst("Z"); // O(1) — добавление в начало

Характеристики:

  • Цепочка связанных узлов (nodes)
  • Медленный доступ по индексу: O(n)
  • Быстрое удаление/вставка в начало/конец: O(1)
  • Больше памяти на overhead каждого узла

SingletonList и других неизменяемых реализациях:

List<String> single = List.of("only");  // Неизменяемый список
single.add("fail");  // UnsupportedOperationException

Сравнение реализаций

ОперацияArrayListLinkedListCopyOnWriteArrayList
get(i)O(1)O(n)O(1)
add()O(1) амортизированныйO(1)O(n)
remove(i)O(n)O(n) обычноO(n)
МногопоточностьНе безопаснаНе безопаснаБезопасна
ПамятьМинимум overheadМного (refs)Копии при write

CopyOnWriteArrayList — специальный случай

List<String> list = new CopyOnWriteArrayList<>();
list.add("A");        // Создаёт копию массива
list.get(0);          // O(1), безопасно для чтения
for (String s : list) { // Итерирование безопасно без синхронизации
    list.add("B");     // Не вызывает ConcurrentModificationException
}

Используется когда:

  • Частые чтения, редкие записи
  • Многопоточное окружение
  • Нужна потокобезопасность без явной синхронизации

Итоги

Называть все List реализации «прокачанным массивом» некорректно:

  1. ArrayList — реально основана на массиве, прокачанный вариант
  2. LinkedList — совсем другая структура (связный список)
  3. CopyOnWriteArrayList — специализированная версия для многопоточности
  4. Неизменяемые списки (List.of, Collections.singletonList) — оптимизированы для неизменяемости

Каждая реализация выбирается под конкретный use case, а не потому что это «прокачанный массив».