В чем разница между List и Set в Java?

«В чем разница между List и Set в Java?» — вопрос из категории Java, который задают на 31% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

List и Set — это интерфейсы из Java Collections Framework (JCF) с фундаментально разным поведением.

List (Список):

  • Гарантирует порядок элементов. Элементы имеют индекс (позицию), по которому к ним можно обращаться.
  • Допускает дубликаты. Один и тот же объект можно добавить несколько раз.
  • Типичные реализации: ArrayList (на основе массива, быстрый доступ по индексу), LinkedList (на основе двусвязного списка, быстрая вставка/удаление в середине).
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Apple"); // Дубликат разрешен
System.out.println(list); // [Apple, Banana, Apple]
System.out.println(list.get(1)); // Banana (доступ по индексу)

Set (Множество):

  • Не допускает дубликатов. Попытка добавить существующий элемент игнорируется.
  • Не гарантирует порядка (за исключением специальных реализаций). Основная задача — проверка принадлежности.
  • Типичные реализации: HashSet (самая быстрая, порядок непредсказуем), LinkedHashSet (сохраняет порядок вставки), TreeSet (хранит элементы отсортированными).
Set<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Apple"); // Дубликат игнорируется
System.out.println(set); // [Banana, Apple] (порядок может быть любым)
// Проверка наличия элемента выполняется очень быстро (O(1) для HashSet)
boolean hasApple = set.contains("Apple"); // true

Выбор: Используй List, когда важен порядок или возможны дубликаты (например, история операций). Используй Set, когда нужно гарантировать уникальность элементов (например, коллекция уникальных ID пользователей).