Встречается на 62% собеседований по Java

Расскажи об иерархии коллекций в Java

Иерархия коллекций в Java — это набор интерфейсов и классов в пакете java.util, которые предоставляют общие структуры данных для хранения и обработки групп объектов. Она включает два основных семейства: интерфейс Collection (для списков, множеств и очередей) и интерфейс Map (для пар ключ-значение), при этом Map не наследуется от Collection. Понимание этой иерархии необходимо для выбора правильной структуры данных и эффективного использования стандартной библиотеки Java.

Основные интерфейсы

Корневой интерфейс — Collection, который определяет базовые методы: add(), remove(), size(), isEmpty(), iterator(). От него наследуются три основных подынтерфейса:

  • List — упорядоченная коллекция, допускающая дубликаты. Доступ к элементам по индексу. Основные реализации: ArrayList, LinkedList, Vector.
  • Set — коллекция уникальных элементов, дубликаты запрещены. Реализации: HashSet, LinkedHashSet, TreeSet.
  • Queue — коллекция для хранения элементов перед обработкой, поддерживает операции вставки, извлечения и инспекции. Реализации: LinkedList (также реализует List), PriorityQueue.

Интерфейс Map стоит отдельно: он описывает структуру для хранения пар «ключ-значение», где ключи уникальны, а значения могут повторяться. Реализации: HashMap, LinkedHashMap, TreeMap, Hashtable.

Ключевые реализации и их особенности

КлассСтруктураОсобенности
ArrayListДинамический массивБыстрый доступ по индексу, автоматическое расширение
LinkedListДвусвязный списокЭффективное добавление/удаление, реализует List и Queue
HashSetХеш-таблицаУникальные элементы, порядок не гарантирован
LinkedHashSetХеш-таблица + связный списокСохраняет порядок вставки
TreeSetКрасно-черное деревоЭлементы отсортированы по возрастанию
HashMapХеш-таблицаБыстрый доступ по ключу, порядок не гарантирован
LinkedHashMapХеш-таблица + связный списокСохраняет порядок вставки или порядок доступа
TreeMapКрасно-черное деревоКлючи отсортированы

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

java
import java.util.*;

public class CollectionExample {
    public static void main(String[] args) {
        // List: допускает дубликаты, сохраняет порядок
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        list.add("apple"); // дубликат разрешен
        System.out.println(list.get(1)); // banana

        // Set: уникальные элементы, порядок не гарантирован
        Set<Integer> set = new HashSet<>();
        set.add(3);
        set.add(1);
        set.add(2);
        set.add(3); // дубликат игнорируется
        System.out.println(set.size()); // 3

        // Map: пары ключ-значение
        Map<String, Integer> map = new HashMap<>();
        map.put("one", 1);
        map.put("two", 2);
        System.out.println(map.get("two")); // 2
    }
}

Подводные камни и советы

  • Map не является частью иерархии Collection, поэтому его нельзя передавать в методы, ожидающие Collection.
  • HashSet и HashMap не гарантируют порядок элементов; если порядок важен, используйте LinkedHashSet/LinkedHashMap (порядок вставки) или TreeSet/TreeMap (сортировка).
  • Vector и Hashtable — устаревшие синхронизированные классы; в однопоточных сценариях предпочтительнее ArrayList и HashMap.
  • LinkedList реализует и List, и Deque, поэтому может использоваться как очередь или стек.
  • PriorityQueue упорядочивает элементы по приоритету (естественный порядок или компаратор), но не гарантирует полную сортировку при итерации.

Коротко

  • Иерархия коллекций: Collection (List, Set, Queue) и отдельно Map.
  • List — упорядоченный с дубликатами; Set — без дубликатов; Queue — для обработки; Map — пары ключ-значение.
  • Выбор реализации зависит от требований к порядку, уникальности, скорости доступа и вставки.
  • Помните про отличия HashMap/HashSet (без порядка) от LinkedHashMap/LinkedHashSet (порядок вставки) и TreeMap/TreeSet (сортировка).
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы