Введение

Практически во всех программах возникает потребность хранить набор каких-либо данных. Это могут быть строки и числа, объекты и т.п. Для этих целей как нельзя кстати подходят массивы. Но у массивов есть некоторые ограничения. Например, фиксированный размер, отсутствие возможности удалять элементы, вставлять элементы в середину. Для обхода этого и других ограничений создали коллекции. Во всех типах коллекций (а их много, как мы увидим далее по ходу этой лекции), есть возможность динамически изменять свой размер. Некоторые типы коллекций могут хранить упорядоченные элементы и автоматически упорядочивать новые элементы по мере их добавления.

В этой лекции мы ознакомимся с иерархией классов базовых коллекций Java Collections Framework. Еще существуют различные альтернативные библиотеки, которые расширяют возможности стандартной Java Collections Framework. Наиболее популярная из них — Guava (Google Collections Library).

* На схеме представлены далеко не все интерфейсы и классы. Некоторые упущены для простоты понимания

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

На схеме видно, что существует два основных интерфейса, от которых реализуются остальные классы и интерфейсы коллекций.

Давай рассмотрим эти интерфейсы:

  1. Collection – обычная коллекция, которая содержит набор отдельных элементов (объектов). В этой коллекции есть основные методы для работы с элементами: вставка (add, addAll), удаление (remove, removeAll, clear), поиск (contains, containsAll), проверка на пустоту коллекции (isEmpty) и размер (size).

  2. Map — коллекция, структура которой представляет собой пары "ключ — значение". Причем в рамках одной Map каждый ключ уникален: нет двух одинаковых по значению ключей. Также эту коллекцию иногда называют словарем (dictionary). Map — это отдельный интерфейс. Он не реализует интерфейс Collection, но входит в Java Collections Framework.

Основные методы для работы с элементами Map:

  • вставка (put, putAll)

  • получение (get, keySet, values, entrySet)

  • удаление (remove, clear)

  • поиск (containsKey, containsValue)

  • проверка на пустоту коллекции (isEmpty)

  • размер (size)

А теперь давай подробнее поговорим о каждом из них.

Интерфейс Collection

Интерфейс Collection расширяет интерфейс Iterable, а у этого интерфейса есть единственный метод iterator(). Для нас это означает, что любая коллекция, которая наследуется от Iterable, будет уметь возвращать итератор.

Итератор – это специальный объект, с помощью которого можно получить доступ к элементам любой коллекции, не учитывая особенностей ее реализации.

Из рисунка видно, что от интерфейса Collection наследуется 3 интерфейса: List, Queue и Set. Сейчас кратко рассмотрим каждый из них.

List — это упорядоченная коллекция, допускающая дубликаты среди значений. Также можно встретить и другие название — последовательность (sequence), список. Особенностью List является то, что элементы пронумерованы и к ним можно обращаться по номеру (индексу).

Queue — переводится с английского как очередь. Правильное произношение: Queue — КЬЮ. В Queue элементы хранятся в порядке добавления их в очередь.

Set – в отличие от списка, описывает неупорядоченную коллекцию, в которой нет повторов элементов. У Set есть соответствие с понятием в математике — м множество (set).

Реализации интерфейса Map

В интерфейсе Map мы можем видеть соотношение уникальных ключей со значениями.


interface Мар<К, V>

где К — это тип ключей, а V — тип хранимых значений.

По ключу мы можем извлекать данные из Map. Для добавления элемента в Map нужно задать ключ и значение.

Рассмотрим некоторые реализации Map:

  1. HashMap — реализация Map, в основе которой лежат хэш-таблицы. Может хранить ключи и значения любых типов, в том числе и null. Порядок элементов не гарантирован.

  2. LinkedHashMap — структура данных, хранит данные в виде связного списка элементов. Элементы расположены в том порядке, в котором они добавлялись.

  3. TreeMap — реализует интерфейс SortedMap (через NavigableMap). Элементы в такой структуре хранятся в отсортированном виде (при добавлении нового элемента коллекция сортируется автоматически). TreeMap отлично подходит для хранения больших объемов отсортированной информации с осуществлением быстрого поиска.

Устаревшие коллекции

От прошлых версий Java остались устаревшие коллекции (для поддержания обратной совместимости), которые использовать не рекомендуется:

  • Enumeration — аналог интерфейса Iterator;

  • Vector — упорядоченный список элементов, аналог класса ArrayList;

  • Stack — структура, которая реализует хранение элементов по принципу стека (например, стопка книг), есть методы вталкивания (push) и выталкивания (pop) элементов;

  • Dictionary — аналог интерфейса Map, но является абстрактным классом;

  • Hashtable — аналог HashMap.

Подробнее о Collections Framework ты можешь прочесть в этой статье.