Читайте также: |
|
Пакет java.util содержит одно из наиболее захватывающих расширений Java 2 – коллекции.
Коллекция – это группа объектов. Добавление коллекций вызвало фундаментальные изменения в структуре и архитектуре многих элементов пакета java.util. Они также расширили круг задач, к которым может применяться пакет. Коллекции – современная технология, которая заслуживает внимания всех программистов Java.
В дополнение к коллекциям, java.util содержит большой выбор классов и интерфейсов, которые поддерживают широкий диапазон функциональных возможностей. Эти классы и интерфейсы используются повсюду в пакетах ядра Java, а также доступны для применения в пользовательских программах. Подобные приложения включают генерацию псевдослучайных чисел, манипулирование датой и временем, наблюдение за событиями, манипулирование наборами битов и синтаксический анализ строк. Из-за обширного набора свойств java.util – один из наиболее широко используемых пакетов Java.
Структура коллекций (collections framework) Java стандартизирует способ, с помощью которого ваши программы обрабатывают группы объектов. В прошлых версиях Java обеспечивал специальные классы типа Dictionary, Vector, Stack и Properties для хранения и манипулирования группами объектов. Хотя перечисленные классы были весьма полезны, они испытывали недостаток в централизованном, унифицирующем подходе при работе с группами объектов. Таким образом, способ использования класса vector, например, отличался от способа применения класса Properties. Кроме того, предыдущий специальный (ad hoc) подход не был предназначен для легкого расширения и адаптации. Коллекции как раз явились ответом на эти (и другие) проблемы.
Структура коллекций была разработана для нескольких целей. Во-первых, структура должна была быть высокоэффективной. Действительно, реализации фундаментальных коллекций (динамических массивов, связанных списков, деревьев и хеш-таблиц) в структуре коллекций Java 2 высокоэффективны. Во-вторых, структура коллекций должна была позволить различным типам коллекций работать похожим друг на друга образом и с высокой степенью способности к взаимодействию. В-третьих, расширение и/или адаптация коллекции должна была быть простой.
Для удобства созданы различные реализации специального назначения, а также некоторые частичные реализации, которые упрощают создание собственного коллекционного класса. Наконец, были добавлены механизмы, которые позволяют интегрировать в структуру коллекций стандартные массивы.
Алгоритмы – другая важная часть механизма коллекций. Алгоритмы работают на коллекциях и определены как статические методы в классе Collections. Таким образом, они доступны для всех коллекций. Каждый коллекционный класс не нуждается в реализации своих собственных версий. Алгоритмы обеспечивают стандартные средства манипулирования коллекциями..
Другой элемент, созданный структурой коллекций, – это интерфейс Iterator. Итератор обеспечивает универсальный, стандартизированный способ доступа к элементам коллекции – по одному. Таким образом, итератор обеспечивает средства перечисления содержимого коллекции. Поскольку каждая коллекция интерфейс Iterator, к элементам любого коллекционного класса можно обращаться через методы этого интерфейса. Поэтому (и только с мелкими изменениями) код, который циклически проходит, скажем, через набор, может также использоваться для циклического прохода списка, например.
И последнее, если вы знакомы с C++, то полезно знать, что технология коллекций Java подобна (по духу) Стандартной Библиотеке Шаблонов (STL. Standard Template Library), определенной в C++. То, что C++ называет контейнером, Java называет коллекцией.
На рисунке 5.1 показана общая структура коллекций.
В структуре коллекций определено несколько интерфейсов. Начать с интерфейсов коллекции необходимо потому, что они определяют фундаментальный характер коллекционных классов. Иначе, конкретные классы просто являются различными реализациями стандартных интерфейсов. Интерфейсы, которые подкрепляют коллекции, кратко описаны в таблице 5.1.
Рисунок 5.1 – Структура коллекций
Таблица 5.1 Интерфейсы коллекций
Интерфейс | Описание |
Collection | Дает возможность работать с группами объектов; он находится наверху всей иерархии коллекций |
List | Расширяет Collection для обработки последовательностей (списков) объектов |
Set | Расширяет Collection для обработки наборов (sets), которые должны содержать уникальные элементы |
SortedSet | Расширяет Set для обработки сортированных наборов (sorted sets) |
В дополнение к этим интерфейсам, коллекции используют также интерфейсы Comparator, Iterator и ListIterator.
Для обеспечения максимальной гибкости в использовании, некоторые методы в интерфейсах коллекций могут быть необязательными. Необязательные методы дают возможность изменить содержимое коллекции. Коллекции, которые поддерживают эти методы, называются изменяемыми (modifiable). Коллекции, которые не допускают изменения их содержимого, называются неизменяемыми (unmodifiable). Если сделана попытка использования одного из необязательных методов на неизменяемой коллекции, выбрасывается исключение UnsupportedOperationException. Все встроенные коллекции являются изменяемыми.
Интерфейс Collection – это основа, на которой сформирована структура коллекций. В нем объявляются основные методы, которые будут наследоваться всеми коллекциями. Эти методы описаны в таблице 5.2. Поскольку все коллекции реализуют интерфейс Collection, знакомство с его методами необходимо для четкого понимания структуры коллекций. Некоторые из методов могут выбрасывать исключение UnsupportedOperationException. Это происходит, если коллекция не может быть изменена. Исключение ClassCastException генерируется тогда, когда один объект несовместим с другим, т. е. когда осуществляется попытка добавить к коллекции несовместимый объект.
Таблица 5.2. Методы интерфейса Collection
Метод | Описание |
boolean add(Object obj) | Прибавляет obj к вызывающей коллекции. Возвращает true, если obj был добавлен к коллекции, и false, если obj уже является элементом коллекции или если коллекция не допускает дубликатов |
boolean addAll (Collection c) | Добавляет все элементы с к вызывающей коллекции. Возвращает true, если операция закончилась успешно (т. е. все элементы были добавлены). Иначе возвращает false |
void clear () | Удаляет все элементы из вызывающей коллекции |
boolean contains(Object obj) | Возвращает true, если вызывающая коллекция содержит элемент obj. Иначе – false |
boolean containsAll(Collection c) | Возвращает true, если вызывающая коллекция содержит все элементы с. Иначе – false |
boolean equals(Object obj) | Возвращает true, если объект вызывающей коллекции и объект obj равны. Иначе – false |
int hashCode() | Возвращает хэш-код вызывающей коллекции |
boolean isEmpty() | Возвращает true, если вызывающая коллекция пуста. Иначе – false |
Iterator iterator() | Возвращает итератор (iterator) для вызывающей коллекции |
boolean remove(object obj) | Удаляет один экземпляр obj из вызывающей коллекции. Возвращает true, если элемент был удален. Иначе – false |
boolean removeAll(Collection c) | Удаляет все элементы с из вызывающей коллекции. Возвращает true, если коллекция изменена (т. е. элементы были удалены). Иначе возвращает false |
boolean retainAll(Collection c) | Удаляет все элементы из вызывающей коллекции, кроме элементов с. Возвращает true, если коллекция изменена (т. е. элементы были удалены). Иначе возвращает false |
int size() | Возвращает число элементов, содержащихся в вызывающей коллекции |
Object[ ] toArray() | Возвращает массив, который содержит все элементы, хранящиеся в вызывающей коллекции. Элементы массива являются копиями элементов коллекции |
Object[ ] toArray(Object array[ ]) | Возвращает массив, содержащий только те элементы коллекции, чей тип согласуется с типом элементов массива array. Элементы этого массива являются копиями элементов коллекции Если размер массива array равен количеству согласованных элементов, они возвращаются прямо в массиве array. Если размер array меньше, чем количество согласованных элементов, то распределяется и возвращается новый массив необходимого размера. Если размер array больше, чем количество согласованных элементов, элемент массива, следующий за последним элементом коллекции, устанавливается в null. Если любой элемент коллекции имеет тип, который не является подтипом массива array, то выбрасывается исключение ArrayStoreException. |
Интерфейс List расширяет Collection и объявляет поведение коллекции, которая хранит последовательность элементов. Элементы могут быть вставлены или извлечены с помощью их позиций в списке через отсчитываемый от нуля индекс. Список может содержать дублированные элементы.
В дополнение к методам, определенным в Collection, интерфейс List определяет собственные методы, которые показаны в таблице 5.3. Некоторые из этих методов выбрасывают исключения UnsupportedOperationException, если коллекция не может изменяться, и ClassCastException, когда один объект несовместим с другим, например, когда делается попытка добавить к коллекции несовместимый объект.
Таблица 5.3 Методы интерфейса List
Метод | Описание |
void add(int index, Object obj) | Вставляет obj в вызывающий список в позицию с индексом index. Любые элементы, существовавшие ранее в точке вставки или за ней, сдвигаются (т. е. никакие элементы не перезаписываются поверх уже существующих) |
boolean addAll (int index, Collection c) | Вставляет все элементы с в вызывающий список с позиции(индекса! index. Любые элементы, существовавшие ранее в точке вставки или за ней, сдвигаются (т. е. никакие элементы не перезаписываются поверх уже существующих). Возвращает true, если вызывающий список изменяется, и false – иначе |
Object get(int index) | Возвращает объект, хранящийся в индексной позиции index вызывающей коллекции |
indexOf (Object obj) | Возвращает индекс (номер) первого экземпляра объекта obj в вызывающем списке. Если obj – не элемент списка, то возвращается -1 |
int lastlndexOf (Object obi) | Возвращает индекс последнего экземпляра obj в вызывающем списке. Если obj - не элемент списка, то возвращается -1 |
ListIterator listIterator() | Возвращает итератор, установленный к началу вызывающего списка |
ListIterator listIterator (int index) | Возвращает итератор, установленный к позиции index вызывающего списка |
Object remove(int index) | Удаляет элемент в позиции index из вызывающего списка и возвращает удаленный элемент. Результирующий список уплотняется (т. е. индексы последующих элементов уменьшаются на 1) |
Object set(int index, Object obj) | Устанавливает объект obj S позицию, указанную в index, в вызывающем списке |
List subList(int start, int end) | Возвращает список, который включает элементы от номера start до end-1 вызывающего списка. После этого вызывающий обьект будет ссылаться на элементы возвращенного (а не исходного)списка |
Вызывая метод subList(), можно получить подсписок списка, указывая индексы (номера позиций) начала и окончания подсписка (в исходном списке). Использование этого метода обеспечивает очень удобную обработку списков.
Интерфейс Set расширяет интерфейс Collection и объявляет поведение коллекции, не допускающей дублирования элементов. Поэтому метол add() возвращает false, если осуществляется попытка добавить в набор дублирующие элементы. В Set не определяется никаких дополнительных собственных методов.
Интерфейс SortedSet расширяет Set и объявляет поведение набора, отсортированного в возрастающем порядке. В дополнение к методам, определенным в Set, интерфейс SortedSet объявляет методы, представленные в таблице 5.4.
Некоторые методы выбрасывают исключение NoSuchElementException, когда элементы не содержатся в вызывающем наборе. Исключение ClassCastException выбрасывается, когда объект несовместим с элементами набора, а исключение NuiiPointerException – если сделана попытка использовать null-объект1 (null-объекты недопустимы в наборе).
Таблица 5.4 Методы интерфейса SortList
Метод | Описание |
Comparator comparator() | Возвращает компаратор вызывающего сортированного набора. Если для этого набора используется естественное упорядочение, то возвращается null (пустая ссылка) |
Object first () | Возвращает первый элемент вызывающего сортированного набора |
SortedSet headSet(Object end) | Возвращает SortedSet-объект, содержащий те элементы вызывающего сортированного набора, которые меньше, чем end. На эти элементы ссылается также и вызывающий объект |
Object last() | Возвращает последний элемент вызывающего отсортированного набора |
SortedSet subset(Object start, Object end) | Возвращает объект SortedSet, который содержит элементы, находящиеся между объектами start и end-1 вызывающего отсортированного списка. На эти элементы ссылается также и вызывающий объект |
SortedSet tailSet(Object start) | Возвращает объект SortedSet, который содержит элементы сортированного набора, больше чем или равные start-объекту. На элементы возвращенного набора ссылается также и вызывающий объект |
После ознакомления с интерфейсами коллекций рассмотрим стандартные классы, которые их реализуют. Для некоторых классов обеспечены полные реализации, которые можно использовать непосредственно (т. е. сразу же приступая к созданию их экземпляров). Другие классы являются абстрактными и обеспечивают только схематические реализации, которые служат отправными точками для создания конкретных коллекций. Ни один из коллекционных клaccoв не синхронизирован, но можно получить и синхронные версии. Стандартные классы коллекций перечислены в таблице 5.5
Таблица 5.5 Стандартные классы коллекций
Класс | Описание |
AbstractCollection | Реализует большую часть интерфейса Collection |
AbstractList | Расширяет AbstractCollection и реализует большую масть интерфейса List |
AbstractSequentiaList | Расширяет класс AbstractList для реализации коллекции, которая использует последовательный, а не произвольный доступ к ее элементам |
LinkedList | Реализует связный список, расширяя класс AbstractSequentialList |
ArrayList | Реализует динамический массив, расширяя класс AbstractList |
AbstractSet | Расширяет класс AbstractCollection и реализует большую часть интерфейса Set |
HashSet | Расширяет класс AbstractSet для реализации хеш-таблиц |
TreeSet | Реализует набор, хранящийся в виде дерева (древовидный набор). Расширяет класс AbstractSet |
Дата добавления: 2015-10-29; просмотров: 133 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Квантификаторы | | | Как задать шрифт |