— Ну і насамкінець розповім про Map.
Map, як ти знаєш, зберігає набір пар «ключ-значення». Ключі мають бути унікальні, значення – будь-які. Якщо ти додаєш у Map пару ключ-значення, а такий ключ у колекції вже є, то старе значення замінить нове. Тобто. ключ – це щось подібне до унікального індексу, який може бути будь-яким об'єктом.
Як тільки назва Map не перекладається російською мовою. Версій вже існує, мабуть, десяток півтора. Найпоширенішими є Словник, Карта, Відображення, …
Назва Map – це математичний термін, який позначає набір (безліч) пар (x,y), де кожному унікальному x відповідає якийсь y.
Программісти дуже люблять Map, тому у нас тут аж 4 різні колекції, що реалізують інтерфейс java Map:
Ось тобі її простенька структура успадкування:
Жовтим зазначено, що 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 такий?
— Це клас, який описує кілька елементів. Методів у нього небагато:
Методи | Опис |
---|---|
K getKey() |
Повертає значення ключа пари. |
V getValue() |
Повертає значення значення пари. |
V 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.
— Вірю з огляду на те, що ти все правильно назвав. Тоді йди відпочивай. Увечері побачимося.
— Поки що, Еллі.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ