
- •Лабораторная работа № 4 Работа с исключениями и коллекциями
- •Исключения в Java. Теоретические сведения
- •Использование try, catch и throw
- •Использование множественного catch и finally
- •Использование ключевого слова throws
- •Системные исключения
- •UnsupportedOperationException - обнаружена неподдерживаемая операция Коллекции (перечислимые типы) в Java. Теоретические сведения.
- •Иерархия интерфейсов коллекций
- •Назначение интерфейсов, расширяющих интерфейс Collection
- •Рабочие классы интерфейса List
- •Массив типа ArrayList
- •Методы класса ArrayList
- •Массив типа LinkedList
- •Методы класса LinkedList
- •Ассоциативные массивы в Java
- •Диаграмма интерфейса Map
- •Рабочие классы интерфейса Map
- •Задание
- •Приложение 1. Работа с датой и временем в Java
- •Приложение 2. Пример общего класса обработки ошибок, сообщений и логирования.
Ассоциативные массивы в Java
Интерфейс Map предназначен для хранения структур данных типа «ключ-значение». Такие структуры часто называют ассоциативный массивами, подразумевая, что каждое значение ассоциируется с некоторым уникальным ключом. Очевидно, что повторов ключей быть не может. Поэтому диаграмма классов интерфейса Set похожа на диаграмму классов интерфейса Map. Однако, хорошо видно наличие методов работы с ключами и значениями ключей: containsKey(...), containsValue(...), keySet() и т.д.
Интерфейс Map реализуют четыре рабочих класса: HashMap, LinkedHashMap, TreeMap и WeakHashMap.
Диаграмма интерфейса Map
( источник: http://www.quizful.net/post/Java-Collections )
Рабочие классы интерфейса Map
Map |
|
HashMap |
Основан на хэш-таблицах, что подразумевает хранение данных в виде пар ключ/значение. Ключи и значения могут быть любых типов, в том числе и null. Данная реализация не дает гарантий относительно порядка элементов с течением времени |
LinkedHashMap |
Расширяет класс HashMap. Он создает связный список элементов в карте, расположенных в том порядке, в котором они вставлялись. Это позволяет организовать перебор карты в порядке вставки. То есть, когда происходит итерация по коллекционному представлению объекта класса LinkedHashMap, элементы будут возвращаться в том порядке, в котором они вставлялись. |
TreeMap |
Расширяет класс AbstractMap и реализует интерфейс NavigatebleMap. Для хранения элементов применяет дерево. Объекты сохраняются в отсортированном порядке по возрастанию. Время доступа и извлечения элементов достаточно мало, но, очевидно, сравнительно велико время записи, т.к. добавляемой сущности нужно найти правильное место в дереве. По сути все древовидные структуры реализуют принцип - «подальше положишь, поближе возьмешь» |
WeakHashMap |
Коллекция, использующая слабые ссылки для ключей (а не значений). Слабая ссылка (англ. weak reference) — специфический вид ссылок на динамически создаваемые объекты в системах со сборкой мусора. Отличается от обычных ссылок тем, что не учитывается сборщиком мусора при выявлении объектов, подлежащих удалению. Ссылки, не являющиеся слабыми, также иногда именуют «сильными». |
Рассмотрим подробнее востребованные методы работы класса HashMap. Остальные классы можно посмотреть в документации (см. папку «Основы Java») по адресу или в подсказке Eclipse.
Методы класса HashMap
Название |
Назначение |
Сложность |
put(key, value) |
Добавляет value по ключу key |
O(1) |
replace(key, value) |
Изменяет значение по ключу key на value |
O(1)-O(n) |
get(key) |
Возвращает значение по ключу key |
O(1)-O(n) |
remove(key) |
Удаляет элемент с ключом key |
O(1)-O(n) |
containsKey(value) |
Проверяет наличие ключа key. Возвращает: true | false |
O(1)-O(n) |
containsValue(value) |
Проверяет наличие значения value. Возвращает: true | false |
O(1)-O(n) |
keySet() |
Возвращает множество ключей. Из множества можно удалять элементы (ключи и соответствующие им значения автоматически удаляются из Map). Нельзя добавлять новые элементы. |
- |
values() |
Возвращает множество значений. Из множества можно удалять элементы (ключи и соответствующие им значения автоматически удаляются из Map). Нельзя добавлять новые элементы. |
- |
entrySet() |
Возвращает представление карты в виде множества объектов Map.Entry, т.е. пар "ключ-значение". Из множества можно удалять элементы (ключи и соответствующие им значения автоматически удаляются из Map). Нельзя добавлять новые элементы. |
- |
size() |
Получить размер коллекции |
O(1) |
Пример. Методы работы с элементами Map import java.util.Map; import java.util.HashMap; ...
Map<String, String> test = new HashMap <String, String>(); //Ввод данных test.put("first", "Иван"); test.put("second", "Жан"); test.put("three", "Иван"); //Изменение данных test.replace("second", "Жан+"); //Получение данных System.out.println(test.get("second")); // Жан+ //Удаление данных test.remove("three"); //Поиск по значению System.out.println(test.containsValue("Жан")); // false System.out.println(test.containsValue("Жан+")); // true //Поиск ключа System.out.println(test.containsKey("first")); // true |
Подобно HashList объект класса HashMap имеет внутри приватный массив (таблицу) элементов Entry. Поэтому для перебора элментов ассоциативного массива Map применяется итератор элементов. Поскольку ассоциативный массив не допускает повтора ключей, перебор элементов ассоциативного массива типа Map может быть осуществлен с помощью итератора, после приведения к виду интерфейса Set.
Пример. Перебор всех элементов ассоциативного массива c приведением к интерфейсу Set import java.util.Map.Entry;
// Работа с множеством ключей for (String key: test.keySet()) System.out.println(test.get(key));
// Работа с entrySet без итератора for (Map.Entry<String, String> entry: test.entrySet()) System.out.println(entry.getKey() + " = " + entry.getValue());
// Работа с entrySet c итератором Iterator <Entry<Integer, String>> itr = test.entrySet().iterator(); while(itr.hasNext()) { Entry<Integer, String> entry = (Entry<Integer, String>) itr.next(); System.out.println ("Key="+entry.getKey()+"\t"+"Value="+entry.getValue()); }
// Работа с values System.out.println(test.values()); // Вернет - [Иван, Иван, Жан] ArrayList<String> list = new ArrayList<String>(test.values()); for (String s : list) System.out.print(s+", "); // Вернет, например - Иван, Иван, Жан. |
Контрольные вопросы
Что называется исключением в Java?
Какие исключения Java может и не может перехватить программист?
Для чего используется finally?
Как программист может сам создать исключение?
Как передать исключение в вышерасположенный вызывающий код?
Что такое коллекция в Java?
Как происходит динамическое увеличение коллекции ArrayList?
Как происходит динамическое увеличение коллекции LinkedList?
Чем отличаются ArrayList и LinkedList?
Расскажите о классах ассоциативных массивов в Java
Зачем для обхода динамических массивов (коллекций) применяется итератор?