Иерархия Java Collections Framework
Карта интерфейсов
Java Collections Framework объединяет интерфейсы, реализации и алгоритмы из java.util.
Iterable
└── Collection
├── List
│ ├── ArrayList
│ └── LinkedList
├── Set
│ ├── HashSet
│ ├── LinkedHashSet
│ └── SortedSet
│ └── NavigableSet
│ └── TreeSet
└── Queue
├── PriorityQueue
└── Deque
├── ArrayDeque
└── LinkedList
Map // отдельная ветка, не Collection
├── HashMap
├── LinkedHashMap
├── SortedMap
│ └── NavigableMap
│ └── TreeMap
└── ConcurrentMap
└── ConcurrentHashMapЭто не полный перечень классов, а рабочая карта выбора.
Как читать контракты
Каждый уровень добавляет свой инвариант:
| Интерфейс | Что гарантирует |
|---|---|
Iterable<E> | объект можно обойти через Iterator<E> |
Collection<E> | группа элементов и базовые операции |
List<E> | порядок, индексы, дубликаты |
Set<E> | отсутствие дубликатов по правилам равенства |
Queue<E> | извлечение по политике очереди |
Deque<E> | работа с обоими концами |
Map<K,V> | каждому уникальному ключу соответствует не более одного значения |
SortedSet / SortedMap | элементы или ключи отсортированы |
NavigableSet / NavigableMap | поиск ближайших меньших и больших значений |
Тип интерфейса описывает требуемое поведение, а класс реализации — устройство и стоимость операций:
List<String> order = new ArrayList<>();
Set<String> uniqueIds = new HashSet<>();
Deque<Task> pending = new ArrayDeque<>();
Map<String, User> usersById = new HashMap<>();Как выбирать реализацию
- Сначала зафиксировать семантику: порядок, уникальность, сортировка, доступ с концов или поиск по ключу.
- Затем оценить преобладающие операции и их сложность.
- Отдельно проверить требования к
null, параллельному доступу и изменяемости.
По умолчанию обычно достаточно:
ArrayListдля последовательности;HashSetдля проверки уникальности;ArrayDequeдля стека или очереди;HashMapдля индекса по ключу.
Сортированные и concurrent-реализации выбирают из-за конкретного контракта, а не «на всякий случай».
Ловушки
LinkedListодновременно реализуетListиDeque, но это не делает его лучшим выбором для обеих задач.- Порядок обхода
HashMapиHashSetне является частью контракта. Collections.synchronizedListсинхронизирует отдельные методы, но составные действия и обход требуют внешней синхронизации.- Неизменяемые фабрики
List.of,Set.of,Map.ofне принимаютnull;Set.ofтакже отвергает дубликаты. - Интерфейс не гарантирует конкретную сложность — её задаёт реализация.
Вопросы на собеседовании
- Почему
Mapвынесен в отдельную ветку? - Какие гарантии добавляют
List,SetиQueue? - Чем
SortedMapотличается отNavigableMap? - Как выбрать между
ArrayList,HashSet,ArrayDequeиHashMap? - Почему порядок
HashSetнельзя использовать как часть бизнес-логики?
Связанные заметки
Collection · List · Set · Queue and Deque · Map · Big O оценка сложности операций с коллекциями · ConcurrentHashMap