— Ну і насамкінець розповім про Map.

Map, як ти знаєш, зберігає набір пар «ключ-значення». Ключі мають бути унікальні, значення – будь-які. Якщо ти додаєш у Map пару ключ-значення, а такий ключ у колекції вже є, то старе значення замінить нове. Тобто. ключ – це щось подібне до унікального індексу, який може бути будь-яким об'єктом.

Як тільки назва Map не перекладається російською мовою. Версій вже існує, мабуть, десяток півтора. Найпоширенішими є Словник, Карта, Відображення, …

Назва Map – це математичний термін, який позначає набір (безліч) пар (x,y), де кожному унікальному x відповідає якийсь y.

Программісти дуже люблять Map, тому у нас тут аж 4 різні колекції, що реалізують інтерфейс java Map:

Ось тобі її простенька структура успадкування:

Ієрархія Map - 1

Жовтим зазначено, що Entry – це вкладений інтерфейс в інтерфейсі Map.

Entry було додано, щоб описати саме пару елементів як одну сутність.

Ось які методи є у Map<K,V>:

Методи Опис
int size() Повертає кількість пар у map.
boolean isEmpty() Перевіряє, чи пустий map.
boolean containsKey(Object key) Чи містить map заданий ключ?
boolean containsValue(Object value) Чи містить map задане значення?
V get(Object key) Повертає значення за ключом.
V put(K key, V value) Встановлює нове значення ключа.
Метод повертає старе значення або null
putAll(Map<? extends K, ? extends V> m) Додає пари з іншого map.
void clear() Очищає map – видаляє всі пари.
Set<K>keySet() Повертає Set із ключів.
Collection<V>values() Повертає колекцію зі значень.
Set<Map.Entry<K, V>>entrySet() Повертає безліч (Set) пар.

K,V – це типи-параметри для ключів (Key) та значень (Value).

— Ну, з більшістю методів я знайомий, хоча працював лише з деякими з них.

А що ще за Entry такий?

— Це клас, який описує кілька елементів. Методів у нього небагато:

Методи Опис
getKey() Повертає значення ключа пари.
getValue() Повертає значення значення пари.
setValue(V value) Встановлює нове значення значення пари.

Entry зручний тим, що ти можеш взяти якусь пару та передати її у потрібний метод, не передаючи туди всю колекцію map.

— Ясно.

— Ну і пробіжуся ще реалізаціями Map.

Перша на черзі – це колекція HashMap. Вона використовує хеш-таблиці для зберігання елементів. Ключі та значення можуть бути будь-яких типів, а також можуть бути null. Порядок елементів може змінюватися при зміні колекції.

Елементи зберігаються усередині HashMap у вигляді набору груп – кошиків (bucket). В якийсь кошик потрапить елемент — залежить від значення його hashCode().

Дуже грубо кажучи, елементи зі значенням хеш-коду від 1 до 100 потрапляють у перший кошик, зі значенням від 101 до 200 — по-друге, і т.д.

Зміст такого зберігання в тому, що при пошуку/видаленні можна відкидати непотрібні кошики, та виключати всі їх елементи з розгляду.

— Ясно.

— Є дуже хороша стаття з HashMap, раджу почитати. /p>

Друга колекція – це LinkedHashMap. Основна її відмінність від HashMap – вона додатково зберігає елементи як зв'язковий список. У звичайній HashMap порядок елементів невизначений і, власне кажучи, може змінюватися з часом. А у LinkedHashMap можна отримати ітератор і за допомогою нього перебрати всі елементи в порядку їхнього додавання в LinkedHashMap. Також у LinkedHashMap є ітератор, який дозволяє обійти всі пари в порядку з останнього використання/активності.

Є дуже хороша стаття з LinkedHashMap, тримай http://habrahabr.ru/post/129037/

Третя колекція, про яку я хотіла б сьогодні розповісти – це TreeMap.

TreeMap зберігає свої елементи відсортованими за зростанням. Це досягається завдяки тому, що TreeMap для їх зберігання використовує збалансоване червоно-чорне бінарне дерево.

Завдяки цьому там дуже низький час вставки та пошуку елементів. Цей клас є відмінним вибором при використанні дуже великих обсягів даних.

Ну і, звичайно ж, стаття з TreeMap: http://www.quizful.net/ post/Java-TreeMap

Що я ще не розповіла?

— WeakHashMap, але мені Ріша розповідав про нього кілька днів тому.

— Це коли?

— Ну, коли розповідала про SoftReference, WeakReference та PhantomReference.

— Вірю з огляду на те, що ти все правильно назвав. Тоді йди відпочивай. Увечері побачимося.

— Поки що, Еллі.