Что такое интерфейс List в Java и в чем разница между ArrayList и LinkedList?

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

Ответ

List<E> — это упорядоченная коллекция (последовательность) в Java, которая позволяет хранить дублирующиеся элементы и предоставляет доступ по индексу. Это один из фундаментальных интерфейсов Java Collections Framework (JCF).

Основные реализации и их отличия:

Критерий ArrayList LinkedList
Внутренняя структура Динамически расширяемый массив (Object[]). Двусвязный список узлов (Node<E>).
**Доступ по индексу (get(i), set(i)) O(1) — очень быстрый. O(n) — медленный, требует обхода списка.
Вставка/удаление в начале/середине O(n) — медленно, требует сдвига элементов. O(1) — быстро, если известен узел.
Использование памяти Меньше накладных расходов (только массив). Больше (хранение ссылок next и prev).
Итерация Быстрая. Быстрая (но с большими константными издержками).

Пример использования:

// Создание и базовые операции
List<String> list = new ArrayList<>(); // Чаще всего используется ArrayList
list.add("Apple");
list.add("Banana");
list.add(1, "Orange"); // Вставка по индексу
String fruit = list.get(0); // Доступ по индексу -> "Apple"
list.remove("Banana");

// Итерация
for (String item : list) {
    System.out.println(item);
}
// Или с использованием Stream API
list.stream().filter(s -> s.startsWith("A")).forEach(System.out::println);

Когда что выбирать:

  • ArrayList: В 95% случаев. Оптимален, когда преобладают операции чтения и случайного доступа.
  • LinkedList: Стоит рассмотреть, если частыми операциями являются вставка/удаление в начале списка (как в Deque), или когда важна эффективность операций addAll() из другой коллекции.