1 Java 10. КОЛЛЕКЦИИ Множества Карты отображений
2 Множества Интерфейс Set объявляет поведение коллекции, не допускающей дублирования элементов. Интерфейс SortedSet наследует Set и объявляет поведение набора, отсортированного в возрастающем порядке, заранее определенном для класса. Интерфейс NavigableSet существенно облегчает поиск элементов. Множества часто используются для проверки принадлежности объекта заданному множеству. Т.е. важнейшая операция Set - операция поиска, поэтому на практике обычно выбирается реализация HashSet, оптимизированная для быстрого поиска. Set Hierarchy Interface Hierarchy
3 Класс HashSet наследуется от абстрактного суперкласса AbstractSet и реализует интерфейс Set, используя хэш-таблицу для хранения коллекции. Ключ (хэш-код) используется вместо индекса для доступа к данным, что значительно ускоряет поиск определенного элемента. Скорость поиска существенна для коллекций с большим количеством элементов. Все элементы такого множества упорядочены посредством хэш- таблицы, в которой хранятся хэш-коды элементов. example09 - использование множества для вывода всех уникальных слов из файла : DemoHashSet.java
4 Класс TreeSet Класс TreeSet для хранения объектов использует бинарное дерево. При добавлении объекта в дерево он сразу же размещается в необходимую позицию с учетом сортировки. Сортировка происходит благодаря тому, что все добавляемые элементы реализуют интерфейсы Comparator и Comparable. Обработка операций удаления и вставки объектов происходит медленнее, чем в хэш-множествах, но быстрее, чем в списках.
5 Методы класса TreeSet E first() E last() извлечение первого и последнего (наименьшего и наибольшего) элементов SortedSet subSet(E from, E to) SortedSet tailSet(E from) SortedSet headSet(E to) извлечение определенной части множества Comparator comparator() возвращает объект Comparator, используемый для сортировки объектов множества или null, если выполняется обычная сортировка example09 - создание множества из списка и его методы: DemoTreeSet.java
6 EnumSet > Абстрактный класс EnumSet > наследуется от абстрактного класса AbstractSet. Специально реализован для работы с типами enum. Все элементы такой коллекции должны принадлежать единственному типу enum, определенному явно или неявно. Внутренне множество представимо в виде вектора битов, обычно единственного long. Множества нумераторов поддерживают перебор по диапазону из нумераторов. Скорость выполнения операций над таким множеством очень высока, даже если в ней участвует большое количество элементов.
7 Создание объектов EnumSet Создать объект этого класса можно только с помощью статических методов класса: EnumSet noneOf(Class elemType) cоздает пустое множество нумерованных констант с указанным типом элемента. allOf(Class elementType) создает множество нумерованных констант, содержащее все элементы указанного типа. of(E first, E... rest) создает множество, первоначально содержащее указанные элементы. complementOf(EnumSet s) создает множество, содержащее все элементы, которые отсутствуют в указанном множестве. range(E from, E to) создает множество из элементов, содержащихся в диапазоне, определенном двумя элементами. При передаче вышеуказанным методам в качестве параметра null будет сгенерирована исключительная ситуация NullPointerException. example09 - иcпользование множества enum-типов : UseEnumSet.java
8 Методы интерфейса NavigableSet first() возвращает первый элемент из множества subSet(E fromElement, E toElement) возвращает список элементов, находящихся между fromElement и toElement, причем последний не включается headSet(E element) tailSet(E element, boolean inclusive) возвращают то множество элементов, которое меньше либо больше element соответственно Если inclusive равно true, то элемент включается в найденное множество и не включается в противном случае example09 - иcпользование множества NavigableSet: NavigableSetTest.java
9 Карты отображений Карта отображений – это объект, который хранит пару ключ- значение. Поиск объекта (значения) облегчается по сравнению с множествами за счет того, что его можно найти по его уникальному ключу. Уникальность объектов-ключей должна обеспечиваться переопределением методов hashCode() и equals() пользовательским классом. Если элемент с указанным ключом отсутствует в карте, то возвращается значение null.
10 Интерфейсы карт Map – отображает уникальные ключи и значения Map.Entry – описывает пару ключ-значение SortedMap – содержит отсортированные ключи и значения NavigableMap – добавляет новые возможности поиска по ключу Interface Hierarchy
11 Классы карт отображений AbstractMap – реализует интерфейс Map HashMap – расширяет AbstractMap, используя хэш- таблицу, в которой ключи отсортированы относительно значений их хэш-кодов TreeMap – расширяет AbstractMap, используя дерево, где ключи расположены в виде дерева поиска в строгом порядке WeakHashMap позволяет механизму сборки мусора удалять из карты значения по ключу, ссылка на который вышла из области видимости приложения LinkedHashMap запоминает порядок добавления объектов в карту и образует при этом дважды связанный список ключей. Этот механизм эффективен, только если превышен коэффициент загруженности карты при работе с кэш памятью и др. IdentityHashMap хэш-коды объектов-ключей вычисляются методом System.identityHashCode() по адресу объекта в памяти, в отличие от обычного значения hashCode(), вычисляемого сугубо по содержимому самого объекта. Map Hierarchy
12 Методы интерфейса Map void clear() удаляет все пары из вызываемой карты boolean containsKey(Object key) возвращает true, если вызывающая карта содержит key как ключ boolean containsValue(Object value) возвращает true, если вызывающая карта содержит value как значение Set > entrySet() возвращает множество, содержащее значения карты Set keySet() возвращает множество ключей V get(Object obj) возвращает значение, связанное с ключом obj
13 Методы интерфейса Map V put(K key, V value) помещает ключ key и значение value в вызывающую карту. При добавлении в карту элемента с существующим ключом произойдет замена текущего элемента новым. При этом метод возвратит заменяемый элемент void putAll Map t) помещает коллекцию t в вызывающую карту V remove(Object key) удаляет пару ключ-значение по ключу key Collection values() возвращает коллекцию, содержащую значения карты
14 Методы интерфейса Map.Entry K getKey() возвращает ключ текущего входа V getValue() возвращает значение текущего входа V setValue(V obj) устанавливает значение объекта obj в текущем входе example10 : создание хэш-карты и замена элемента по ключу: DemoHashMap.java example 10 : применение коллекций при проверке доступа в систему : DemoSecurity.java
15 EnumMap, V> Класс EnumMap, V> в качестве ключа может принимать только объекты, принадлежащие одному типу enum, который должен быть определен при создании коллекции. Специально организован для обеспечения максимальной скорости доступа к элементам коллекции. example10 : пример работы с классом EnumMap: UseEnumMap.java
16 Унаследованные коллекции В ряде распределенных приложений, например с использованием сервлетов, до сих пор применяются коллекции, более медленные в обработке, но при этом потокобезопасные, существовавшие в языке Java с момента его создания: карта Hashtable, список Vector Перечисление Enumeration. Все они также были параметризованы, но сохранили все свои особенности. Класс Hashtable реализует интерфейс Map, но обладает также несколькими интересными методами: Enumeration elements() – возвращает перечисление (аналог итератора) для значений карты; Enumeration keys() – возвращает перечисление для ключей карты пример11 : создание хэш-таблицы и поиск элемента по ключу: HashTableDemo.java
17 Класс Collections Класс Collections содержит большое количество статических методов, предназначенных для манипулирования коллекциями. С применением предыдущих версий языка было разработано множество коллекций, в которых никаких проверок нет, следовательно, при их использовании нельзя гарантировать, что в коллекцию не будет помещен посторонний объект. Для этого в класс Collections был добавлен новый метод – checkedCollection(): public static Collection checkedCollection(Collection c, Class type) Этот метод создает коллекцию, проверяемую на этапе выполнения, то есть в случае добавления постороннего объекта генерируется исключение ClassCastException example11 : проверяемая коллекция: SafeCollection.java
18 Специализированные методы Класса Collections checkedList(), checkedSortedMap(), checkedMap(), checkedSortedSet(), checkedSet() для проверки конкретных типов коллекций boolean addAll(Collection c, T... a) добавляет в параметризованную коллекцию соответствующие параметризации элементы void copy(List dest, List src) копирует все элементы из одного списка в другой boolean disjoint(Collection c1, Collection c2) возвращает true, если коллекции не содержат одинаковых элементов
19 Специализированные методы Класса Collections List emptyList(), Map emptyMap(), Set emptySet() возвращают пустой список, карту отображения и множество соответственно void fill(List list, T obj) заполняет список заданным элементом int frequency(Collection c, Object o) возвращает количество вхождений в коллекцию заданного элемента > T max(Collection coll) > T min(Collection coll) возвращают минимальный и максимальный элемент соответственно
20 Специализированные методы Класса Collections T max(Collection coll, Comparator comp) T min(Collection coll, Comparator comp) возвращают минимальный и максимальный элемент соответственно, используя Comparator для сравнения boolean replaceAll(List list, T oldVal, T newVal) заменяет все заданные элементы новыми > void sort(List list) void sort(List list, Comparator c) сортировка списка, естественным порядком и используя Comparator соответственно void swap(List list, int i, int j) меняет местами элементы списка стоящие на заданных позициях
21 Специализированные методы Класса Collections List nCopies(int n, T o)возвращает список из n заданных элементов void reverse(List list)переворачивает список; void rotate(List list, int distance)сдвигает список циклически на заданное число элементов void shuffle(List list)перетасовывает элементы списка Set singleton(T o) List singletonList(T o) Map singletonMap(K key, V value) создают множество, список и карту отображения, состоящие из одного элемента /* пример # 11 : методы класса Collections: CollectionsDemo.java */
22 Методы класса Arrays int binarySearch(параметры)перегруженный метод организации бинарного поиска значения в массивах примитивных и объектных типов. Возвращает позицию первого совпадения void fill(параметры)перегруженный метод для заполнения массивов значениями различных типов и примитивами void sort(параметры)перегруженный метод сортировки массива или его части с использованием интерфейса Comparator и без него static T[ ] copyOf(T[ ] original, int newLength) заполняет массив определенной длины, отбрасывая элементы или заполняя null при необходимости
23 Методы класса Arrays static T[ ] copyOfRange(T[ ] original, int from, int to) копирует заданную область массива в новый массив List asList(T... a)метод, копирующий элементы массива в объект типа List /* пример # 11 : методы класса Arrays : ArraysEqualDemo.java*/
24 Ключевые моменты Интерфейс Set объявляет поведение коллекции, не допускающей дублирования элементов Карта отображений – это объект, который хранит пару ключ- значение ( Map ) Различные реализации Set и Map обеспечивают различные способы хранения элементов и доступа к ним Для работы с элементами карт используется интерфейс Map.Entry