Вплоть до Java 2, Java предоставляла особые классы, такие как Dictionary, Vector, Stack, и Properties для хранения и управления группами объектов. Хоть эти классы были полезными, им не хватало центральной, объединяющей тематики. Именно поэтому то, как вы использовали Vector отличается от того, как вы использовали Properties.

Структура коллекций в Java была создана для того чтобы удовлетворять таким целям, как:

  • Фреймворк должен быть высокопроизводительным. Реализации фундаментальных коллекций (динамические массивы, связанные списки, деревья и хэш-таблицы) должны быть высокоэффективными.
  • Фреймворк должен позволять разным типам коллекций работать аналогичным образом и с высокой степенью совместимости.
  • Фреймворк должен уметь расширяться и/или легко адаптировать коллекцию

С этой целью вся структура коллекций разработана вокруг набора стандартных интерфейсов. Несколько стандартных реализаций типа LinkedList, HashSet, и TreeSet из этих интерфейсов предоставляются таким образом, что вы можете их использовать «как есть» или можете реализовать свою собственную коллекцию по вашему выбору.

Фреймворк коллекций – это объединённая архитектура для представления и управления коллекциями. Все структуры коллекций содержат в себе следующее:

  • Интерфейсы – это абстрактные типы данных, которые представляют коллекции. Интерфейсы позволяют управлять коллекциями вне зависимости от деталей их представления. В объектно-ориентированных языках интерфейсы обычно формируют иерархию.
  • Реализации, т.e. классы – Это конкретные реализации интерфейсов коллекций. По сути, они являются структурными данных, которые можно многократно использовать.
  • Алгоритмы – это методы, которые выполняют полезные вычисления с объектами, которые реализуют интерфейсы коллекций, например поиск и сортировку. Алгоритмы считаются полиморфными, то есть один и тот же метод может быть использован во множестве различных реализаций соответствующего интерфейса коллекций.

Помимо коллекций, фреймворк определяет некоторые интерфейсы и классы карт. Карты хранят пары ключ/значение. Хоть карты не являются коллекциями в обычном их понимании, но они полностью интегрированы с коллекциями.

Интерфейсы коллекций

Структура коллекций определяет некоторые интерфейсы в Java. Этот раздел вкратце описывает каждый из них.

Интерфейс и описание
1Интерфейс Collection
Позволяет работать с группами объектов; находится на вершине иерархии коллекций.
2Интерфейс List
Расширяет Collection и экземпляр List хранит упорядоченный набор элементов.
3Интерфейс Set
Расширяет Collection, чтобы обрабатывать наборы, которые должны содержать уникальные элементы.
4SortedSet
Расширяет Set для обработки отсортированных наборов.
5Map
Привязывает уникальные ключи к значениям
6Map.Entry
Описывает элемент (пара ключ/значение) в карте. Это внутренний класс Map.
7SortedMap
Расширяет Map так, чтобы ключи были расположены в порядке возрастания.
8Enumeration
Устаревший интерфейс, определяющий методы, которым вы можете перечислить (получать по одному за раз) элементы в коллекции объектов. Этот устаревший интерфейс был заменен Iterator

Классы коллекций

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

Стандартные классы коллекций в Java приведены в следующей таблице:

Класс и описание
1AbstractCollection
Реализует большую часть интерфейса Collection
2AbstractList
Расширяет AbstractCollection и реализует большую часть интерфейса List
3AbstractSequentialList
Расширяет AbstractList для использования коллекцией, которая использует последовательный, а не произвольный доступ к своим элементам.
4LinkedList
Реализует связанный список, расширяя AbstractSequentialList.
5ArrayList
Реализует динамический массив, расширяя AbstractList
6AbstractSet
Расширяет AbstractCollection и реализует большую часть интерфейса Set.
7HashSet
Расширяет AbstractSet для использования в хэш-таблице
8LinkedHashSet
Расширяет HashSet, чтобы разрешить итерации порядка вставки.
9TreeSet
Реализует набор, хранящийся в дереве. Расширяет AbstractSet.
10AbstractMap
Реализует большую часть интерфейса Map.
11HashMap
Расширяет AbstractMap для использования хэш-таблицы
12TreeMap
Расширяет AbstractMap для использования дерева.
13WeakHashMap
Расширяет AbstractMap для использования хеш-таблицы со слабыми ключами.
14LinkedHashMap
Расширяет HashMap, чтобы разрешить итерации порядка вставки.
15IdentityHashMap
Расширяет AbstractMap и использует равенство ссылок при сравнении документов.

Классы AbstractCollection, AbstractSet, AbstractList, AbstractSequentialList и AbstractMap предоставляют скелетные реализации интерфейсов основной коллекции в Java, чтобы свести к минимуму усилия, необходимые для их реализации.

Следующие устаревшие классы, определённые java.util, обсуждались в предыдущей главе:

Класс и описание
1Vector
Реализует динамический массив. Схож с ArrayList, но с некоторыми отличиями.
2Stack
Stack – это подкласс Vector, который реализует стандартный стэк «последним пришёл – первым ушёл».
3Dictionary
Dictionary – это абстрактный класс, который представляет собой хранилище ключей/значений и работает так же, как и Map.
4Hashtable
Hashtable был частью оригинального java.util и является конкретной реализацией Dictionary.
5Properties
Properties – это подкласс Hashtable. Он используется для хранения списков значений, в которых ключ является строкой, и значение тоже является строкой.
6BitSet
Класс BitSet создает специальный тип массива, который содержит значения бит. Этот массив может увеличиваться в размерах при необходимости.

Алгоритмы Collection

Структура коллекций определяет несколько алгоритмов, которые могут применяться к коллекциям и картам. Эти алгоритмы определяются как статические методы в классе Collections.

Некоторые из методов могут генерировать ClassCastException, которое возникает при попытке сравнить несовместимые типы или UnsupportedOperationException, которое возникает, когда предпринимается попытка изменить немодифицируемую коллекцию.

Коллекции определяют три статические переменные: EMPTY_SET, EMPTY_LIST и EMPTY_MAP. Все неизменны.

Алгоритм и описание
1Алгоритмы Collection
Вот список всех реализаций алгоритма.

Как использовать итератор коллекции в Java?

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

Легчайший способ это сделать – использовать итератор, который является объектом, который реализует интерфейс Iterator или ListIterator.

Iterator позволяет вам перемещаться по коллекции, получать или удалять элементы. ListIterator расширяет Iterator, чтобы обеспечить двунаправленный обход списка и модификацию элементов.

Метод Iterator и описание
1Использование Iterator в Java
Вот список всех методов с примерами, предоставляемыми интерфейсами Iterator и ListIterator.

Как использовать компаратор?

И TreeSet, и TreeMap хранят элементы в отсортированном порядке. Однако, именно компаратор определяет, что такое отсортированный порядок.

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

Метод Comparator и описание
1Использование Comparator в Java
Вот список всех методов с примерами, предоставляемыми интерфейсом Comparator.

Итог

Структура коллекций Java даёт программисту доступ к предварительно упакованным структурам данных, а также к алгоритмам для их управления.

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

Классы и интерфейсы структуры коллекций находятся в java.util.

Оглавление