Карта(map) — це об’єкт, який зберігає значення між ключами та значеннями. По заданому ключу можна знайти тип його значення. Як і ключі так і значення являються об’єктами Java. Ключі можуть бути унікальними, але їх значення дублюватись. Деякі карти допускають null-ключі та null-значення, деякі — ні.
Є один ключовий момент відносно карт, який важливо пам’ятати: всі вони не реалізуються інтерфейсом Iterable. Це означає, що ви не зможете проходити в циклі по карті використовуючи форму ''for each '' циклу for. Більш того ви не зможете отримати інтератор карти. Але можливо отримати представленні карти у вигляді колекції, які допускають використання як і циклу так і інтераторів.
Інтерфейс Map відображає унікальні ключі по їх значенню. Ключ — це об’єкт, який ви використовуєте для подальшого вилучення даних. Задаючи ключ та значення, можете переміщати значення в об’єкт Map. Після того як це значення збережене ви можете отримати його по ключу.
Об’явлення інтерфейсу Map:
interface Map<K, V>
де K — вказує тип значення, а V — тип даних, які зберігаються.
Методи об’явлення Map зібрані в таблиці 2.1. Деякі методи виключають використання ClassCastExeption, коли об’єкт являється несумісним з об’єктами карти. Виключення NullPointerExeption ініціюється якщо при намаганні використати null-об’єкт, коли дана карта цього не допускає. Виключення UnsupportedOperationException, що генерується при намаганні змінити карту, яка не модифіковується.
Карти використовуються навколо двох основних операцій: get() та put(). Для того щоб помістити значення в карту, використовуйте put(), попередньо вказавши ключ та значення. Для того щоб отримати значення виконайте get(), передаючи ключі в якості аргументів. Значення буде повернуто. Не дивлячись на те що карти являються частиною каркасу колекції, самі по собі вони не реалізують інтерфейс Collection, однак ви можете отримати представлення карт у вигляді колекцій. Для цього можна використати метод entrySet(). Він повертає Set, який містить елементи карти. Для того, щоб отримати колекційне представлення ключів використовуйте метод keyset().
Таблиця 2.1 - Методи використанні в Map
Метод
| Опис
|
void clear()
| Видаляє всі пари ''ключ-значення'' з викликаної карти
|
boolean containsKey(Object k)
| Повертає true, якщо викликана карта містить ключ k. В протилежному випадку повертає false.
|
boolean containsValue(Object v)
| Повертає true, якщо викликана карта містить ключ v. В протилежному випадку повертає false.
|
set<Map.Entry<K, V>> entrySet()
| Повертає Set, який містить всі значення карти. Містить об’єкти типу Map.Entry. Тобто цей метод представляє карту у вигляді набору.
|
boolean equals(Object obj)
| Повертає true, якщо obj — це Map, що містить знакові значення. В протележному випадку викликає false
|
boolean equals(Object obj)
| Повертає true,якщо obj — Map, що містить одинакові значення. В протилежному випадку повертає false
|
V get (Object k)
| Повертає значення асоційоване з ключем k. Повертає null якщо ключ не знайдений.
|
int hashCode()
| Повертає хеш-код викликаної карти.
|
boolean isEmpty()
| Повертає true, якщо викликана карта порожня. В протилежному випадку викликає false.
|
Set<K> keySet()
| Повертає Set, котрий містить ключі викликаної карти. Цей метод викликає ключі викликаної карти у вигляді набору.
|
V put(K k, V v)
| Переміщує елемент в викликану карту, перезаписуючи будь-яке попереднє значення, асоційоване з ключем. Ключ та значення це — k та v . Повертає null, якщо ключ раніше не існував. В протилежному випадку повертається попереднє значення, зв’язане з ключем.
|
void putAll(Map<? Extends K, ? extends V> m)
| Поміщає всі значення з m в карту.
|
V remove (Object k)
| Видаляє елемент ключ якого рівний k.
|
Int size()
| Повертає число пар ''ключ-значення'' в карті.
|
Сollection<V> values()
| Повертає колекцію, що містить значення карт. Цей метод представляє значення, що містяться в карті у вигляді колекції.
|
Для того, щоб отримати колекційне представлення значень, використовуйте values().
Колекційні представлення — це засоби, використовуючи які карти інтегруються у великий каркас колекцій.
Реалізацію інтерфейсів карт пропонують декілька класів. Класи котрі можуть бути використані для карт представленні в таблиці 2.2
Таблиця 2.2 - Класи котрі можуть бути використанні для карт
Клас
| Функція
|
AbstractMap
| Реалізує більшу частину інтерфейсу Map.
|
EnumMap
| Розширює AbstractMap для використання з ключами enum.
|
HashMap
| Розширює AbstractMap для використання хеш-таблиць.
|
TreeMap
| Розширює AbstractMap для використання для використання дерева.
|
WeakHashMap
| Розширює AbstractMap для використання хеш-таблиць зі слабкими ключами.
|
LinkedHashMap
| Розширює HashMap, розширюючи інтератори у порядку вставки.
|
IndentifyHashMap
| Розширює AbstractMap та використовує перевірку посилочної еквівалентності при порівняні документів.
|
Клас TreeMap розширює AbstractMap та реалізує інтерфейс NavigatebleMap. Він створює карту розміщену в деревоподібній структурі. TreeMap пропонує ефективний спосіб зберігання пар ''ключ — значення'' в сортованому порядку та дозволяє швидке вилучення. Потрібно відмітити, що на відміну від хеш-карт, карта-дерево(tree-map) гарантує, що її елементи будуть відсортовані в порядку росту ключів. TreeMap являється загальним класом з наступним об’явленням:
class TreeMap<K, V>
де K вказує тип ключів, а V — тип даних, що зберігаються
В TreeMap визначенні наступні конструктори:
TreeMap()
TreeMap(Comparator<? Super K> comp)
TreeMap(Map<? Extends K, ? extends V> m)
TreeMap(SortedMap<K, ? extends V> sm)
Перша форма створює пусту карту-дерево, яка буде відсортована з використанням простого порядку ключів. Друга форма конструює пусту карту, засновану на дереві, що буде відсортована з використанням Comparator Comp. Третя форма ініціалізує карту-дерево з елементами з m, що будуть відсортовані по звичайному порядку ключів. Четверта форма створює карту-дерево з елементами із sm, які будуть відсортовані в тому ж порядку що і sm.
TreeMap не визначає додаткових методів, крім тих, що присутні в інтерфейсі NavigableMap і в класі AbstractMap.
Клас TreeMap відрізняється від інших тим, що його елементи впорядковані по ключу.
Впорядкування, яке підтримується у відсортованій карті повинне бути увідповідності з еквівалентом, якщо воно відсортоване по карті, для правильного застосовування карти-інтерфейсу. Поведінка відсортованої карти є чітко визначеною, навіть якщо її упорядкування є несумісним.
Асинхронна реалізація. Якщо кілька потоків отримали доступ до карти одночасно, то принаймні один з потоків змінює карту структурно, в такому випадку вона повинна бути синхронізована зовні. Це звичайно досягається шляхом синхронізації на певний об’єкт, що, природньо інкапсулює карту. Якщо такий об'єкт існує, карта повинна бути "загорнута" з використанням методу Collections.synchronizedMap. Найкраще це робити під час програмування, для запобігання випадкового несинхронізованого доступу до карти:
Map m = Collections.synchronizedMap (new TreeMap (...));
public TreeMap() створює нову порожню карту, яка сортуються відповідно до "природного порядку ключів. Всі ключі, які вставлені в карту повинні реалізувати порівняльний інтерфейс. Крім того, всі такі ключі повинні бути порівнянні між собою та не повинні покидати ClassCastException для будь-яких елементів K1 і K2 в карті. Якщо користувач намагається покласти ключ в карту, яка порушує це обмеження (наприклад, користувач намагається поставити рядок ключа в карту, ключі якої є цілими числами) користувач повинен викликати ClassCastException.
public TreeMap (Comparator с) створює нову порожню карту, яка сортуються відповідно до даного компаратора. Всі ключі вставлені в карту повинні бути порівнянні між собоюпо даному компаратору: comparator.compare (K1, K2), які не повинні покидати ClassCastException для будь-якого ключа K1 і K2 в карті. Якщо користувач намагається покласти ключ в карту, яка порушує це обмеження, потрібно викликати ClassCastException.
Параметри:
C — компаратор, який буде використовуватися для сортування карти. Null значення вказує, що ключі повинні бути використанні "природного порядку".
public TreeMap ( Map m) створює новий шар, що містить ті ж відображення в якості даної карти, які сортуються відповідно до ключів «природного порядку». Всі ключі вставлені в новій карті повинні бути реалізовані порівняльним інтерфейсом. Цей метод працює в N * Log (N) часу.
public TreeMap ( SortedMap m)
Створює новий шар, що містить такі самі карти як і SortedMap та сортуються відповідно з тим самим порядком. Цей метод працює за лінійний час.