Что быстрее для получения элемента по индексу: ArrayList или LinkedList в Java?

«Что быстрее для получения элемента по индексу: ArrayList или LinkedList в Java?» — вопрос из категории Алгоритмы и структуры данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ArrayList значительно быстрее.

  • ArrayList обеспечивает доступ за константное время O(1), так как реализован на основе обычного массива. Операция get(index) сводится к вычислению смещения в памяти: адрес_начала + (index * размер_элемента).
  • LinkedList обеспечивает доступ за линейное время O(n) в среднем случае, так как реализован на основе двусвязного списка. Для получения элемента по индексу необходимо последовательно пройти от головы (или хвоста, если индекс ближе к нему) до нужной позиции.

Сравнение на примере:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class AccessSpeedTest {
    public static void main(String[] args) {
        List<Integer> arrayList = new ArrayList<>();
        List<Integer> linkedList = new LinkedList<>();

        // Заполняем обе коллекции
        for (int i = 0; i < 100_000; i++) {
            arrayList.add(i);
            linkedList.add(i);
        }

        // Быстрый доступ в ArrayList
        int elementFromArray = arrayList.get(50_000); // Мгновенный доступ

        // Медленный доступ в LinkedList
        int elementFromLinked = linkedList.get(50_000); // Требует обхода ~50k узлов
    }
}

Вывод: Для сценариев, где часты операции чтения или получения элементов по индексу (random access), ArrayList является оптимальным выбором. LinkedList эффективен при частых вставках/удалениях в начале или середине списка, если у вас уже есть итератор на нужную позицию.