List, ArrayList, LinkedList

Тема дорожной карты · Java

ArrayList и интерфейс List — фундаментальные части Java Collections framework, предоставляющие упорядоченную, индексированную структуру для хранения и манипуляции последовательностями объектов на JVM. Интерфейс List расширяет Collection и определяет контракт для позиционного доступа, поиска, итерации и представлений диапазона, тогда как ArrayList — его реализация на основе изменяемого массива, обеспечивающая O(1) произвольный доступ через get(int index) и амортизированный O(1) add() в конец. LinkedList предоставляет альтернативную реализацию List и Deque на основе двусвязного списка узлов, обеспечивая O(1) вставку и удаление на обоих концах, но O(n) произвольный доступ — что делает выбор между ArrayList и LinkedList критическим решением в проектировании Java Collections. Обе реализации поддерживают Generics, позволяя типобезопасные объявления вроде List<String> или List<Map<String, Integer>>, и беспрепятственно работают со Stream API, Lambda-выражениями и утилитными методами Collectionssort, shuffle и unmodifiableList. Глубокое понимание ArrayList и интерфейса List существенно для написания эффективного Java-кода в сценариях Spring, маппинга сущностей Hibernate и обработки ResultSet в JDBC.

Как это работает

List, ArrayList, LinkedList даёт 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-обработки.

Типичные ошибки

Ловушки List, ArrayList, LinkedList: выбор LinkedList для "быстрых insert" без замеров (cache-miss затмевает алгоритмическое преимущество); Map<String, ...> с mutable ключевыми объектами (hashCode меняется — потерянные entry); List.of(...) и попытка добавить позже (UnsupportedOperationException); concurrent modification в for-цикле (CME — используйте removeIf или Iterator).

Связанные понятия

Полезные ресурсы