Что представляет собой интерфейс List в Java Collections Framework?

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

Ответ

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

Ключевые характеристики:

  • Порядок: Гарантирует порядок вставки элементов. Элементы доступны по целочисленному индексу (позиции).
  • Дубликаты: Позволяет хранить дублирующиеся элементы.
  • null значения: Как правило, разрешает null элементы (но конкретная реализация может иметь ограничения).
Основные реализации: Реализация Внутренняя структура Ключевые особенности
ArrayList Динамический массив Быстрый случайный доступ по индексу (get, set). Медленные вставка/удаление в середине списка (требует сдвига элементов).
LinkedList Двусвязный список Быстрые вставка и удаление в начале/середине/конце списка. Медленный доступ по индексу (требует обхода с начала или конца). Реализует также интерфейсы Deque и Queue.
Vector Динамический массив Устаревший синхронизированный аналог ArrayList. Не рекомендуется для использования в новых проектах. Для потокобезопасности используйте Collections.synchronizedList() или CopyOnWriteArrayList.
CopyOnWriteArrayList Массив Потокобезопасная реализация из пакета java.util.concurrent. Создает новую копию массива при каждой модификации. Подходит для сценариев, где чтение происходит намного чаще, чем запись.

Важные методы (помимо унаследованных от Collection):

// Доступ по индексу
E get(int index);
E set(int index, E element);

// Вставка и удаление по индексу
void add(int index, E element);
E remove(int index);

// Поиск
int indexOf(Object o); // Первое вхождение
int lastIndexOf(Object o); // Последнее вхождение

// Работа с подсписками
List<E> subList(int fromIndex, int toIndex);

// Итерация с доступом к индексу (Java 8+)
default void forEach(Consumer<? super E> action);

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

List<String> languages = new ArrayList<>();
// Добавление элементов
languages.add("Java");
languages.add("Python");
languages.add(1, "C++"); // Вставка по индексу 1

// Доступ по индексу
String first = languages.get(0); // "Java"

// Итерация с индексом
for (int i = 0; i < languages.size(); i++) {
    System.out.println(i + ": " + languages.get(i));
}

Отличие от Set: List сохраняет порядок и разрешает дубликаты, в то время как Set гарантирует уникальность элементов и, как правило, не сохраняет порядок (кроме LinkedHashSet).