— Ну и напоследок расскажу о 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, советую почитать 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.
— Верю, учитывая, что ты все правильно назвал. Тогда иди отдыхай. Вечером увидимся.
— Пока, Элли.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ