Добавил:
ИВТ (советую зайти в "Несортированное") Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
23.11.2024
Размер:
456.19 Кб
Скачать

Ассоциативные массивы в 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+", "); // Вернет, например - Иван, Иван, Жан.

Контрольные вопросы

  1. Что называется исключением в Java?

  2. Какие исключения Java может и не может перехватить программист?

  3. Для чего используется finally?

  4. Как программист может сам создать исключение?

  5. Как передать исключение в вышерасположенный вызывающий код?

  6. Что такое коллекция в Java?

  7. Как происходит динамическое увеличение коллекции ArrayList?

  8. Как происходит динамическое увеличение коллекции LinkedList?

  9. Чем отличаются ArrayList и LinkedList?

  10. Расскажите о классах ассоциативных массивов в Java

  11. Зачем для обхода динамических массивов (коллекций) применяется итератор?