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

Какие знаешь основные реализации листовых коллекций?

1.6 Junior🔥 281 комментариев
#Коллекции#Основы Java

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

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

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

Основные реализации листовых коллекций в Java

Листовые коллекции — это один из ключевых компонентов Java Collections Framework. Они реализуют интерфейс List и отличаются по своей внутренней структуре, производительности и область применения.

ArrayList

ArrayList — это динамический массив, который реализует интерфейс List на основе обычного массива объектов.

ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.get(0); // O(1)
list.remove(0); // O(n)

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

  • Быстрый доступ по индексу O(1)
  • Медленная вставка/удаление в середину O(n) — требует сдвига элементов
  • Динамическое расширение при переполнении (увеличивает ёмкость на 50%)
  • Потоконо-опасен — не синхронизирован
  • Лучше всего для частого чтения данных

LinkedList

LinkedList — это двусвязный список, где каждый элемент содержит ссылки на предыдущий и следующий элементы.

LinkedList<String> list = new LinkedList<>();
list.add("Java");
list.addFirst("Python"); // O(1)
list.get(0); // O(n) — требует обхода с начала
list.remove(0); // O(1) — если уже на этой позиции

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

  • Медленный доступ по индексу O(n)
  • Быстрая вставка/удаление O(1), если уже знаем позицию
  • Отличный для операций addFirst, addLast, removeFirst, removeLast
  • Реализует интерфейсы Queue и Deque
  • Лучше всего для частых вставок и удалений в начало/конец

Vector (устаревший)

Vector — это синхронизированный аналог ArrayList, созданный в JDK 1.0.

Vector<String> vector = new Vector<>();
vector.add("Java");
vector.get(0); // потокобезопасно, но медленнее

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

  • Синхронизирован — все методы имеют synchronized
  • Медленнее ArrayList из-за синхронизации
  • Увеличивает ёмкость в 2 раза (в отличие от ArrayList на 50%)
  • Практически не используется в современном коде
  • Для многопоточности лучше использовать Collections.synchronizedList()

CopyOnWriteArrayList

CopyOnWriteArrayList — потокобезопасная реализация для конкурентного доступа.

CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("Java"); // копирует весь массив
list.get(0); // O(1), без блокировок

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

  • Потокобезопасен для чтения БЕЗ блокировок
  • Копирует массив при каждой модификации — дорого для частых изменений
  • Отличный для коллекций с частым чтением и редкими записями
  • Идеален для слушателей событий (listeners)

Сравнительная таблица

ОперацияArrayListLinkedListVectorCopyOnWriteArrayList
get(i)O(1)O(n)O(1)O(1)
add()O(1)O(1)O(1)O(n)
add(i)O(n)O(n)O(n)O(n)
remove(i)O(n)O(n)O(n)O(n)
СинхронизированНетНетДаДа

Когда что использовать

  • ArrayList — по умолчанию для 99% случаев (быстрый доступ)
  • LinkedList — когда часто вставляешь/удаляешь в начало/конец
  • Vector — почти никогда (только legacy код)
  • CopyOnWriteArrayList — для многопоточного доступа с частым чтением

Выбор реализации зависит от паттерна использования: если много чтений — ArrayList, если много вставок-удалений — LinkedList.

Какие знаешь основные реализации листовых коллекций? | PrepBro