Коллекции и обобщения

Базовый Java
≈ 2 мин чтения

Когда одного массива уже мало

Массивы удобны, когда размер набора данных известен заранее и нужен простой доступ по индексу. Но в реальных программах данные часто добавляются и удаляются, нужно быстро проверять наличие значения, хранить пары «ключ — значение» или выбирать структуру под конкретный способ работы. Для этого в стандартной библиотеке Java есть коллекции.

В этом разделе мы разберём основные интерфейсы и реализации коллекций, а заодно обобщения — механизм, который позволяет коллекции заранее знать, значения какого типа в ней хранятся. Вместо одного универсального контейнера Java предлагает несколько структур с разными правилами и сильными сторонами.

Что входит в раздел

  • Обобщения. Разберём, как параметр типа делает контейнеры безопаснее и избавляет от лишних приведений типов.
  • Иерархия Collection. Увидим общую картину интерфейсов коллекций и поймём, чем отличаются основные ветви.
  • List. Познакомимся с последовательностями, где важен порядок элементов и доступ по индексу.
  • Set. Разберём наборы, в которых каждый элемент должен быть уникальным.
  • Queue и Deque. Научимся работать с очередями и структурами, доступными с одного или двух концов.
  • Map. Перейдём к хранению данных по ключам, когда значение нужно находить не по позиции, а по смысловому идентификатору.
  • ArrayList и LinkedList. Сравним две реализации List и увидим, почему выбор структуры влияет на характер операций.
  • HashMap. Разберём, как хеширование помогает быстро находить значение по ключу.
  • HashSet. Посмотрим, как та же идея хеширования используется для быстрого хранения уникальных элементов.
  • Comparable и Comparator. Научимся задавать естественный порядок объектов и отдельные правила сравнения.
  • Iterator и Iterable. Увидим механизм, на котором основан последовательный обход элементов.
  • Класс Collections. Соберём полезные готовые операции над коллекциями: сортировку, перестановку, поиск экстремумов и защитные обёртки.

Как темы складываются друг с другом

Сначала нужен общий язык типов — обобщения. Затем мы посмотрим на интерфейсы коллекций и по очереди разберём их основные модели: последовательность, множество, очередь и отображение ключей в значения. После этого станет понятнее, зачем существуют разные реализации и почему одинаковый интерфейс может скрывать совсем разное внутреннее устройство.

В конце раздела мы добавим сравнение объектов, обход элементов и готовые утилиты стандартной библиотеки. После этого коллекции перестанут выглядеть как набор отдельных классов: ты будешь понимать, какую абстракцию выбрать и чего ожидать от кода, который с ней работает.