JavaRush /Курсы /Java Collections /Иерархия Map

Иерархия Map

Java Collections
7 уровень , 5 лекция
Открыта

— Ну и напоследок расскажу о 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, советую почитать http://habrahabr.ru/post/128017/

Вторая коллекция – это 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.

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

— Пока, Элли.

Комментарии (51)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Denis Odesskiy Уровень 47
8 февраля 2025
"— WeakHashMap, но мне Риша рассказывал про него пару дней назад. — Это когда? — Ну, когда рассказывала про SoftReference, WeakReference и PhantomReference." Эмм.. пару дней назад да 🤪... Видимо у роботов время течет иначе... По делу: эта ссылка http://www.quizful.net/post/Java-TreeMap - тухлая !
Mint Уровень 24
6 марта 2024
"Благодаря этому там очень низкое время вставки и поиска элементов." (Про TreeMap) Кто-нибудь объясните, пожалуйста, почему время вставки низкое, если при вставке в красно-черное дерево, нужно сначала найти подходящее место для элемента и затем еще возможно перестроить его. С поиском согласен, так как он у нас отсортирован, то будет легче найти нужный элемент. Со вставкой опечатка или нет?
22 сентября 2023
Автор рофлит. Сидеть потеть часами над задачей про HashMap, чтобы потом тебе вкратце о ней рассказали, зато про WeakHashMap, которую неплохо было бы напомнить ни слова
Нейросеть Уровень 41
22 августа 2023
После Shortener тут только WeekHashMap и интересна, ибо уже подзабылась
Денис Уровень 51
18 мая 2023
А что еще за Entry такой? Что за вопрос такой после Сокращателя)))000
Kasar Уровень 1
24 июля 2023
По моему, тем кто решил задачу "Сокращатель ссылок", эту лекцию можно пропустить
MidNight Уровень 51
9 апреля 2023
Почему нельзя было закончить с коллекциями и рассказывать про паттерны. Зачем все время прыгаем по темам понять не могу ?
Сергей Смарт Уровень 51
14 сентября 2022
Jh-007 Уровень 47
13 июня 2022

В какую корзину попадет элемент — зависит от значения его hashCode().
в прошлом уровне в большой задаче было про HashMap, как я понял, зависит от хэша ключа, а не от хэша обьекта.
Art09 Уровень 35
24 мая 2022
Я один порой не могу понять условие задачи? (Средн. и тяж). В некоторых задачках.
Михаил Уровень 51
19 апреля 2022
Коллеги у всех сайт http://www.quizful.net перестал открываться?
Anna Avilova Уровень 51
26 апреля 2022
у меня 404
Жора Нет Уровень 39
7 мая 2022
Похоже у всех