В чем основное различие между коллекциями List и Set в Java?

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

Ответ

Главное различие — List допускает дубликаты и сохраняет порядок вставки, а Set гарантирует уникальность элементов.

List (Список):

  • Дубликаты: Разрешены.
  • Порядок: Сохраняет порядок вставки (индексированный доступ get(index)).
  • Типичные реализации: ArrayList, LinkedList, Vector.
  • Использование: Когда важен порядок или нужны повторяющиеся элементы.
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 (Множество):

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

Под капотом: HashSet использует HashMap для хранения элементов (O(1) для add, contains), а ArrayList — динамический массив (O(1) для доступа по индексу, O(n) для поиска).