Ответ
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).