Назад | Содержание | Вперед

Lecture Generics & Collections

 






























































Пакет java.util содержит одно из наиболее интересных и существенных расширений Java 2 – коллекции. Коллекция – это группа объектов. Структура коллекций (collections framework) Java стандартизирует способ, с помощью которого ваши программы обрабатывают группы объектов. В прошлых версиях Java обеспечивал специальные классы типа Dictionary, Vector, Stack и Properties для хранения и манипулирования группами объектов. Хотя перечисленные классы были весьма полезны, они испытывали недостаток в централизованном, унифицирующем подходе при работе с группами объектов. Таким образом, способ использования класса Vector, например, отличался от способа применения класса Properties. Кроме того, предыдущий специальный подход не был предназначен для легкого расширения и адаптации. Коллекции как раз явились ответом на эти (и другие) проблемы.

Структура коллекций была разработана для нескольких целей. Во-первых, структура должна была быть высокоэффективной. Действительно, реализации фундаментальных коллекцией (динамических массивов, связанных списков, деревьев и хэш-таблиц) в структуре коллекций Java 2 высоко эффективны. Вам редко (а может и никогда) потребуется кодировать одну из этих "машин данных" вручную. Во-вторых, структура коллекций должна была позволить различным типам коллекций работать похожим друг на друга образом и с высокой степенью способности к взаимодействию. В-третьих, расширение и/или адаптация коллекции должна была быть простой. В довершение ко всему, полная структура коллекцией разработана в окружении набора стандартных интерфейсов. Несколько стандартных реализации этих интерфейсов (такие как LinkedList, Hashset и TreeSet) построены так, что вы можете использовать их непосредственно в том виде, как они есть. Вы также можете реализовать собственную коллекцию по вашему выбору. Для удобства созданы различные реализации специального назначения, а также некоторые частичные реализации, которые упрощают создание собственного коллекционного класса. Наконец, были добавлены механизмы, которые позволяют интегрировать в структуру коллекций стандартные массивы.

Алгоритмы — другая важная часть механизма коллекций. Алгоритмы работают на коллекциях и определены как статические методы в классе Сollections. Таким образом, они доступны для всех коллекций. Каждый коллекционный класс не нуждается в реализации' своих собственных версий. Алгоритмы обеспечивают стандартные средства манипулирования коллекциями.

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

В дополнение к коллекциям рассматриваемая структура определяет несколько интерфейсов и классов отображений. Карта отображений (Map) хранит пары ключ/значение. Хотя карты (отображений) — не "коллекции" (в используемом смысле термина "коллекция"), они полностью интегрированы с коллекциями. На языке структуры коллекций, вы можете получить коллекционный вид или представление (collection-view) карты отображений. Подобное представление содержит элементы карты отображений, хранящиеся в виде коллекции. Таким образом, вы можете обрабатывать содержимое отображения как коллекцию.

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

И последнее, если вы знакомы с C++, то полезно знать, что технология коллекций Java подобна (по духу) Стандартной Библиотеке Шаблонов (STL, Standard Template Library), определенной в C++. То, что C++ называет контейнером, Java называет коллекцией.

 










Интерфейс Collection из пакета java.util описывает общие свойства коллекций List и Set. Он содержит методы добавления и удаления элементов, проверки и преобразования элементов:

 



















Интерфейс Set из пакета java.utii, расширяющий интерфейс Collection, описывает неупорядоченную коллекцию, не содержащую повторяющихся элементов. Это соответствует математическому понятию множества (set). Такие коллекции удобны для проверки наличия или отсутствия у элемента свойства, определяющего множество. Новые методы в интерфейс Set не добавлены, просто метод add() не станет добавлять еще одну копию элемента, если такой элемент уже есть в множестве.

 





























































Абстрактные классы-коллекции

Эти классы лежат в пакете java.util.

Абстрактный класс AbstractCollection реализует интерфейс Сollection, но оставляет нереализованными методы iterator(), size().

Абстрактный класс AbstractList реализует интерфейс List, но оставляет нереализованным метод get(int) и унаследованный метод size(). Этот класс позволяет реализовать коллекцию с прямым доступом к элементам, подобно массиву.

Абстрактный класс AbstractSequantialList реализует интерфейс List, но оставляет нереализованным метод listIterator(int index) и унаследованный метод size(). Данный класс позволяет реализовать коллекции с последовательным доступом к элементам с помощью итератора ListIterator.

Абстрактный класс AbstractSet реализует интерфейс Set, но оставляет нереализованными методы, унаследованные от AbstractCollection.

Абстрактный класс AbstractMap реализует интерфейс Map, но оставляет нереализованным метод entrySet().

Наконец, в составе Java API есть полностью реализованные классы-коллекции. Помимо уже рассмотренных классов Vector, Stack, Hashtable и Properties, это классы ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap, WeakHashMap. Для работы с этими классами разработаны интерфейсы Iterator, Listiterator, Comparator и классы Arrays и  Collections.

 




Класс ArrayList полностью реализует интерфейс List и итератор типа Iterator. Класс ArrayList очень похож на класс Vector, имеет тот же набор методов и может использоваться в тех же ситуациях.

Класс LinkedList полностью реализует интерфейс List и содержит дополнительные методы, превращающие его в двунаправленный список. Он реализует итераторы типа Iterator  и  ListIterator. Этот класс можно использовать для обработки элементов в стеке, деке или двунаправленном списке.

Класс HashMap полностью реализует интерфейс Map, а также итератор типа Iterator. Класс HashMap очень похож на класс Hashtable и может использоваться в тех же ситуациях.

Класс weakHashMap отличается от класса HashMap только тем, что в его объектах неиспользуемые элементы, на которые никто не ссылается, автоматически исключаются из объекта.

Класс TreeMар полностью реализует интерфейс SortedMap. Он реализован как бинарное дерево поиска, значит, его элементы хранятся в упорядоченном виде. Это значительно ускоряет поиск нужного элемента. Порядок задается либо естественным следованием элементов, либо объектом, реализующим интерфейс сравнения Comparator.

Класс HashSet полностью реализует интерфейс Set и итератор типа Iterator. Класс HashSet используется в тех случаях, когда надо хранить только одну копию каждого элемента.

Класс TreeSet полностью реализует интерфейс SortedSet и итератор типа Iterator. Класс TreeSet реализован как бинарное дерево поиска, значит, его элементы хранятся в упорядоченном виде. Это значительно ускоряет поиск нужного элемента. Порядок задается либо естественным следованием элементов, либо объектом, реализующим интерфейс сравнения Comparator. Этот класс удобен при поиске элемента во множестве, например, для проверки, обладает ли какой-либо элемент свойством, определяющим множество.

 
























Назад | Содержание | Вперед




Назад | Содержание | Вперед