Collections Framework
Тема дорожной карты · Java
Java Collections Framework — это унифицированная архитектура интерфейсов, абстрактных классов и конкретных реализаций в пакете java.util, предоставляющая готовые структуры данных для хранения, получения и манипуляции группами объектов. Иерархия фреймворка начинается с Iterable и Collection, разветвляясь на три основных интерфейса: List (упорядоченный, доступный по индексу — ArrayList, LinkedList), Set (уникальные элементы — HashSet, LinkedHashSet, TreeSet) и Queue/Deque (ArrayDeque, PriorityQueue); отдельный интерфейс Map (HashMap, LinkedHashMap, TreeMap) связывает ключи со значениями. Выбор правильной реализации имеет критическое значение для производительности: ArrayList обеспечивает O(1) произвольный доступ, но O(n) вставку в середину; HashMap предлагает O(1) среднее время для get/put с O(n) в худшем случае из-за коллизий хешей; а TreeMap гарантирует O(log n) операции с естественным упорядочиванием ключей через Comparable или Comparator. Утилитный класс java.util.Collections предоставляет алгоритмы Collections.sort(), Collections.unmodifiableList() и Collections.synchronizedMap(), тогда как фабричные методы Java 9+ — List.of() и Map.of() — возвращают компактные неизменяемые реализации. Stream API из Java 8 работает рука об руку с Collections Framework, позволяя разработчикам выражать сложные преобразования данных с помощью Lambda-выражений и ссылок на методы, а не многословных циклов с итераторами.
Как это работает
Collections Framework даёт List (ArrayList, LinkedList), Set (HashSet, TreeSet, LinkedHashSet), Map (HashMap, TreeMap, LinkedHashMap, ConcurrentHashMap), Queue (ArrayDeque, PriorityQueue). Все реализуют Collection (Map отдельно). Streams API (stream(), filter(), map(), collect()) заменяет большинство явных циклов. Immutable factory-методы: List.of(...), Map.of(...), Set.of(...) — возвращают read-only view (бросают при мутации).
Когда применять
ArrayList по умолчанию вместо LinkedList — array-backed доступ драматически быстрее для почти любой реальной нагрузки. HashMap — кроме случаев, где важен порядок (LinkedHashMap для insertion order, TreeMap для sorted). ConcurrentHashMap — для shared-state map (никогда не оборачивайте HashMap в Collections.synchronizedMap в новом коде). Stream — для трансформаций; циклы — для side-effect-обработки.
Типичные ошибки
Ловушки Collections Framework: выбор LinkedList для "быстрых insert" без замеров (cache-miss затмевает алгоритмическое преимущество); Map<String, ...> с mutable ключевыми объектами (hashCode меняется — потерянные entry); List.of(...) и попытка добавить позже (UnsupportedOperationException); concurrent modification в for-цикле (CME — используйте removeIf или Iterator).