Вопрос с собеседования · Java

Сколько стоит получение элемента по индексу в LinkedList?

JuniorКоллекции
Ещё спрашивают так:
  • Чем ArrayList отличается от LinkedList?
  • Когда LinkedList быстрее ArrayList?
  • Почему LinkedList почти не используют?
Коротко

O(n): произвольного доступа нет, до позиции нужно дойти по ссылкам (JDK начинает с ближнего конца).

  • Цикл for (i...) list.get(i) по LinkedList — квадратичная сложность
  • Дешёвы только операции у концов и удаление через итератор

А ещё На практике ArrayList почти всегда быстрее: память подряд и кэш процессора

Подробно

LinkedList — двусвязный список: каждый элемент хранится в отдельном узле со ссылками на предыдущий и следующий. Адрес пятидесятого элемента вычислить нельзя — нужно пройти по цепочке. Реализация в JDK идёт с того конца, который ближе к индексу, но сложность всё равно O(n).

Отсюда практическая ловушка: обход LinkedList по индексам в цикле for (int i = 0; i < list.size(); i++) list.get(i) превращает линейный проход в квадратичный. Перебирать нужно через for-each или итератор.

Миф «вставка в LinkedList дешёвая» верен только частично: сама вставка узла — O(1), но сначала до места вставки нужно дойти за O(n). Дешевы только добавление и удаление у концов и удаление через итератор во время обхода.

На реальном железе ArrayList обычно выигрывает и там, где по теории должен проигрывать: элементы лежат в памяти подряд и хорошо попадают в кэш процессора, а у узлов LinkedList ещё и большой расход памяти на ссылки. Для очереди и стека лучше ArrayDeque.

Что хотят услышать

  • get(i) у LinkedList — O(n), с объяснением почему.
  • Ловушка с обходом по индексам.
  • Понимание, где LinkedList на самом деле дешёв.
  • Практический вывод: ArrayList или ArrayDeque почти всегда лучше.

Частые ошибки

  • Обходить связный список циклом по индексам.
  • Выбирать его ради «быстрой вставки», не учитывая стоимость поиска позиции.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓O(n): идём по узлам от начала или конца
  • ✗Константа, как и в ArrayList: узлы проиндексированы
  • ✗Логарифм от размера списка
  • ✗Зависит от объёма свободной памяти

Что спросят дальше

  • В каких случаях связный список действительно выигрывает?
  • Почему массив обычно быстрее при обходе?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования