Java 10. КОЛЛЕКЦИИ Множества Карты отображений 1
Множества Интерфейс Set объявляет поведение коллекции, не допускающей дублирования элементов. Интерфейс Sorted. Set наследует Set и объявляет поведение набора, отсортированного в возрастающем порядке, заранее определенном для класса. Интерфейс Navigable. Set существенно облегчает поиск элементов. Множества часто используются для проверки принадлежности объекта заданному множеству. Т. е. важнейшая операция Set - операция поиска, поэтому на практике обычно выбирается реализация Hash. Set, оптимизированная для быстрого поиска. Interface Hierarchy Set Hierarchy 2
Класс Hash. Set наследуется от абстрактного суперкласса Abstract. Set и реализует интерфейс Set, используя хэш-таблицу для хранения коллекции. Ключ (хэш-код) используется вместо индекса для доступа к данным, что значительно ускоряет поиск определенного элемента. Скорость поиска существенна для коллекций с большим количеством элементов. Все элементы такого множества упорядочены посредством хэштаблицы, в которой хранятся хэш-коды элементов. example 09 - использование множества для вывода всех уникальных слов из файла : Demo. Hash. Set. java 3
Класс Tree. Set для хранения объектов использует бинарное дерево. При добавлении объекта в дерево он сразу же размещается в необходимую позицию с учетом сортировки. Сортировка происходит благодаря тому, что все добавляемые элементы реализуют интерфейсы Comparator и Comparable. Обработка операций удаления и вставки объектов происходит медленнее, чем в хэш-множествах, но быстрее, чем в списках. 4
Методы класса Tree. Set E first() E last() извлечение первого и последнего (наименьшего и наибольшего) элементов Sorted. Set sub. Set(E from, E to) Sorted. Set tail. Set(E from) Sorted. Set head. Set(E to) извлечение определенной части множества Comparator super E> comparator() возвращает объект Comparator, используемый для сортировки объектов множества или null, если выполняется обычная сортировка example 09 - создание множества из списка и его методы: Demo. Tree. Set. java 5
Enum. Set> Абстрактный класс Enum. Set> наследуется от абстрактного класса Abstract. Set. Специально реализован для работы с типами enum. Все элементы такой коллекции должны принадлежать единственному типу enum, определенному явно или неявно. Внутренне множество представимо в виде вектора битов, обычно единственного long. Множества нумераторов поддерживают перебор по диапазону из нумераторов. Скорость выполнения операций над таким множеством очень высока, даже если в ней участвует большое количество элементов. 6
Создание объектов Enum. Set Создать объект этого класса можно только с помощью статических методов класса: Enum. Set none. Of(Class elem. Type) cоздает пустое множество нумерованных констант с указанным типом элемента. all. Of(Class element. Type) создает множество нумерованных констант, содержащее все элементы указанного типа. of(E first, E. . . rest) создает множество, первоначально содержащее указанные элементы. complement. Of(Enum. Set s) создает множество, содержащее все элементы, которые отсутствуют в указанном множестве. range(E from, E to) создает множество из элементов, содержащихся в диапазоне, определенном двумя элементами. При передаче вышеуказанным методам в качестве параметра null будет сгенерирована исключительная ситуация Null. Pointer. Exception. example 09 - иcпользование множества enum-типов : Use. Enum. Set. java 7
Методы интерфейса Navigable. Set first() возвращает первый элемент из множества sub. Set(E from. Element, E to. Element) возвращает список элементов, находящихся между from. Element и to. Element, причем последний не включается head. Set(E element) tail. Set(E element, boolean inclusive) возвращают то множество элементов, которое меньше либо больше element соответственно Если inclusive равно true, то элемент включается в найденное множество и не включается в противном случае example 09 - иcпользование множества Navigable. Set: Navigable. Set. Test. java 8
Карты отображений Карта отображений – это объект, который хранит пару “ключзначение”. Поиск объекта (значения) облегчается по сравнению с множествами за счет того, что его можно найти по его уникальному ключу. Уникальность объектов-ключей должна обеспечиваться переопределением методов hash. Code() и equals() пользовательским классом. Если элемент с указанным ключом отсутствует в карте, то возвращается значение null. 9
Интерфейсы карт Map – отображает уникальные ключи и значения Map. Entry – описывает пару “ключ-значение” Sorted. Map – содержит отсортированные ключи и значения Navigable. Map – добавляет новые возможности поиска по ключу Interface Hierarchy 10
Классы карт отображений Abstract. Map – реализует интерфейс Map Hash. Map – расширяет Abstract. Map, используя хэштаблицу, в которой ключи отсортированы относительно значений их хэш-кодов Tree. Map – расширяет Abstract. Map, используя дерево, где ключи расположены в виде дерева поиска в строгом порядке Weak. Hash. Map позволяет механизму сборки мусора удалять из карты значения по ключу, ссылка на который вышла из области видимости приложения Linked. Hash. Map запоминает порядок добавления объектов в карту и образует при этом дважды связанный список ключей. Этот механизм эффективен, только если превышен коэффициент загруженности карты при работе с кэш памятью и др. Identity. Hash. Map хэш-коды объектов-ключей вычисляются методом System. identity. Hash. Code() по адресу объекта в памяти, в отличие от обычного значения hash. Code(), вычисляемого сугубо по содержимому самого объекта. Map Hierarchy 11
Методы интерфейса Map void clear() удаляет все пары из вызываемой карты boolean contains. Key(Object key) возвращает true, если вызывающая карта содержит key как ключ boolean contains. Value(Object value) возвращает true, если вызывающая карта содержит value как значение Set> entry. Set() возвращает множество, содержащее значения карты Set key. Set() возвращает множество ключей V get(Object obj) возвращает значение, связанное с ключом obj 12
Методы интерфейса Map V put(K key, V value) помещает ключ key и значение value в вызывающую карту. При добавлении в карту элемента с существующим ключом произойдет замена текущего элемента новым. При этом метод возвратит заменяемый элемент void put. All Map extends K, ? extends V> t) помещает коллекцию t в вызывающую карту V remove(Object key) удаляет пару “ключ-значение” по ключу key Collection values() возвращает коллекцию, содержащую значения карты 13
Методы интерфейса Map. Entry K get. Key() возвращает ключ текущего входа V get. Value() возвращает значение текущего входа V set. Value(V obj) устанавливает значение объекта obj в текущем входе example 10 : создание хэш-карты и замена элемента по ключу: Demo. Hash. Map. java example 10 : применение коллекций при проверке доступа в систему : Demo. Security. java 14
Enum. Map, V> Класс Enum. Map, V> в качестве ключа может принимать только объекты, принадлежащие одному типу enum, который должен быть определен при создании коллекции. Специально организован для обеспечения максимальной скорости доступа к элементам коллекции. example 10 : пример работы с классом Enum. Map: Use. Enum. Map. java 15
Унаследованные коллекции В ряде распределенных приложений, например с использованием сервлетов, до сих пор применяются коллекции, более медленные в обработке, но при этом потокобезопасные, существовавшие в языке Java с момента его создания: l карта Hashtable, l список Vector l Перечисление Enumeration. Все они также были параметризованы, но сохранили все свои особенности. Класс Hashtable реализует интерфейс Map, но обладает также несколькими интересными методами: l Enumeration elements() – возвращает перечисление (аналог итератора) для значений карты; l Enumeration keys() – возвращает перечисление для ключей карты пример11 : создание хэш-таблицы и поиск элемента по ключу: Hash. Table. Demo. java 16
Класс Collections содержит большое количество статических методов, предназначенных для манипулирования коллекциями. С применением предыдущих версий языка было разработано множество коллекций, в которых никаких проверок нет, следовательно, при их использовании нельзя гарантировать, что в коллекцию не будет помещен “посторонний” объект. Для этого в класс Collections был добавлен новый метод – checked. Collection(): public static Collection checked. Collection(Collection c, Class type) Этот метод создает коллекцию, проверяемую на этапе выполнения, то есть в случае добавления “постороннего” объекта генерируется исключение Class. Cast. Exception example 11 : проверяемая коллекция: Safe. Collection. java 17
Специализированные методы Класса Collections checked. List(), checked. Sorted. Map(), checked. Sorted. Set(), checked. Set() для проверки конкретных типов коллекций boolean add. All(Collection super T> c, T. . . a) добавляет в параметризованную коллекцию соответствующие параметризации элементы void copy(List super T> dest, List extends T> src) копирует все элементы из одного списка в другой boolean disjoint(Collection > c 1, Collection > c 2) возвращает true, если коллекции не содержат одинаковых элементов 18
Специализированные методы Класса Collections List empty. List(), Map empty. Map(), Set empty. Set() возвращают пустой список, карту отображения и множество соответственно void fill(List super T> list, T obj) заполняет список заданным элементом int frequency(Collection > c, Object o) возвращает количество вхождений в коллекцию заданного элемента > T max(Collection extends T> coll) > T min(Collection extends T> coll) возвращают минимальный и максимальный элемент соответственно 19
Специализированные методы Класса Collections T max(Collection extends T> coll, Comparator super T> comp) T min(Collection extends T> coll, Comparator super T> comp) возвращают минимальный и максимальный элемент соответственно, используя Comparator для сравнения boolean replace. All(List list, T old. Val, T new. Val) заменяет все заданные элементы новыми > void sort(List list) void sort(List list, Comparator super T> c) сортировка списка, естественным порядком и используя Comparator соответственно void swap(List > list, int i, int j) меняет местами элементы списка стоящие на заданных позициях 20
Специализированные методы Класса Collections List n. Copies(int n, T o) возвращает список из n заданных элементов void reverse(List > list) “переворачивает” список; void rotate(List > list, int distance) сдвигает список циклически на заданное число элементов void shuffle(List > list) перетасовывает элементы списка Set singleton(T o) List singleton. List(T o) Map singleton. Map(K key, V value) создают множество, список и карту отображения, состоящие из одного элемента /* пример # 11 : методы класса Collections: Collections. Demo. java */ 21
Методы класса Arrays int binary. Search(параметры) перегруженный метод организации бинарного поиска значения в массивах примитивных и объектных типов. Возвращает позицию первого совпадения void fill(параметры) перегруженный метод для заполнения массивов значениями различных типов и примитивами void sort(параметры) перегруженный метод сортировки массива или его части с использованием интерфейса Comparator и без него static T[ ] copy. Of(T[ ] original, int new. Length) заполняет массив определенной длины, отбрасывая элементы или заполняя null при необходимости 22
Методы класса Arrays static T[ ] copy. Of. Range(T[ ] original, int from, int to) копирует заданную область массива в новый массив List as. List(T. . . a) метод, копирующий элементы массива в объект типа List /* пример # 11 : методы класса Arrays : Arrays. Equal. Demo. java*/ 23
Ключевые моменты l l Интерфейс Set объявляет поведение коллекции, не допускающей дублирования элементов Карта отображений – это объект, который хранит пару “ключзначение” (Map) Различные реализации Set и Map обеспечивают различные способы хранения элементов и доступа к ним Для работы с элементами карт используется интерфейс Map. Entry 24