Отображения Map

1. Что такое отображение?

Отображение (или карта) представляет собой объект, сохраняющий связи между ключами и значениями в виде пар "ключ-значение". По заданному ключу можно найти его значение.

Ключи и значения являются объектами. Ключи должны быть уникальными, а значения могут быть дублированными.

В одних отображениях допускаются null ключи и null значения, а в других - они не допускаются.

Уникальность ключей определяет реализация метода equals().

Для корректной работы с картами необходимо переопределить методы equals() и hashCode(). Допускается добавление объектов без переопределения этих методов, но найти эти объекты в Map вы не сможете.

Иерархия отображений фото

2. Интерфейс Map

Интерфейс Мар отображает уникальные ключи на значения.

Ключ это объект, который вы используете для последующего извлечения данных. Задавая ключ и значение, вы можете помещать значения в объект Мар. После тогo, как это значение сохранено, вы можете получить eгo по ключу.

Мар обобщенный интерфейс: 

interface Мар<К, V>

Здесь К указывает тип ключей, а V тип хранимых значений.

Методы интерфейса Map:

  • void clear() - удаляет все пары "ключ-значение" из вызывающей карты.
  • boolean containsKey(Object k) - возвращает true, если вызывающая карта содержит ключ k. В противном случае возвращает false.
  • boolean containsValue(Object v) - возвращает true, если вызывающая карта содержит значение v. В противном случае возвращает false.
  • Set<Map. Entry<K, V> entrySet() - возвращает Set, содержащий все значения карты. Набор содержит объекты типа Мар.Entry. То есть этот метод представляет карту в виде набора.
  • V get(Object K) - возвращает значение, ассоциированное с ключом k. Возвращает null, если ключ не найден.
  • boolean isEmpty() - возвращает true, если вызывающая карта пуста. В противном случае возвращает false.
  • Set<K> keySet() - возвращает Set, который содержит ключи вызывающей карты. Этот метод представляет ключи вызывающей карты в виде набора.
  • V put(К k, V v) - помещает элемент в вызывающую карту, перезаписывая любое предшествующее значение, ассоциированное с ключом. Ключ и значение это k и v соответственно. Возвращает null, если ключ ранее не существовал. В противном случае возвращается предыдущее значение, связанное с ключом.
  • void putAll(Мар<? extends К, ? extends V> m) - помещает все значения из m в карту.
  • V remove(Object k) - удаляет элемент, чей ключ равен k.
  • int size() - возвращает число пар "ключ-значение" в карте.
  • Collection<V> values() - возвращает коллекцию, содержащую значения карты. Этот метод представляет значения, содержащихся в карте, в виде коллекции.

3. Интерфейс SortedMap

Интерфейс SortedМap расширяет Мар. Он гарантирует, что элементы размещаются в возрастающем порядке значений ключей.

Методы интерфейса SortedMap:

  • Comparator<? super К> comparator() - возвращает компаратор вызывающей сортированной карты. Если картой используется естественный порядок, возвращается null.
  • К firstKey() - возвращает первый ключ вызывающей карты.
  • К lastKey() - возвращает последний ключ вызывающей карты.
  • SortedМap<K, V> headМap(К end) - Возвращает сортированную карту, содержащую те элементы вызывающей карты, ключ которых меньше end.
  • SortedМap<K, V> subMap(К start, К end) - возвращает карту, содержащую элементы вызывающей карты, чей ключ больше или равен start и меньше end.
  • SortedМap<K, V> tailMap (К start) - возвращает сортированную карту, содержащую те элементы вызывающей карты, ключ которых больше start.

4. Интерфейс NavigableMap

Интерфейс NavigableMap был добавлен в Java 6. Она расширяет SortedМap и определяет поведение карты, поддерживающей извлечение элементов на основе ближайшего соответствия заданному ключу или ключам.

Методы интерфейса NavigableMap:

Методы позволяют получить соответственно меньший, меньше или равный, больший, больше или равную пару “ключ-значение” по отношению к заданному:

Map.Entry<K,V> lowerEntry(K key) 
Map.Entry<K,V> floorEntry(K key)
Map.Entry<K,V> higherEntry(K key)
Map.Entry<K,V> ceilingEntry(K key)

Методы позволяют получить соответственно меньший, меньше или равный, больший, больше или равный ключ по отношению к заданному.

K lowerKey(K key)
K floorKey(K key)
K higherKey(K key)
K ceilingKey(K key)

Методы pollFirstEntry и pollLastEntry возвращают соответственно первый и последний элементы карты, удаляя их из коллекции. Методы firstEntry и lastEntry также возвращают соответствующие элементы, но без удаления:

Map.Entry<K,V> pollFirstEntry()
Map.Entry<K,V> pollLastEntry()
Map.Entry<K,V> firstEntry()
Map.Entry<K,V> lastEntry()

Возвращает карту, отсортированную в обратном порядке:

NavigableMap<K,V> descendingMap()

Методы, позволяющие получить набор ключей, отсортированных в прямом и обратном порядке соответственно:

NavigableSet<K> navigableKeySet()
NavigableSet<K> descendingKeySet()

Методы, позволяющие извлечь из карты подмножество. Как и в случае NavigableSet, указываем в параметрах начальный и конечный элементы массива ключей, а также необходимость включения в выходной набор граничных элементов. Опять же, если не указывать флаги, то будет использован интервал ключевых значений со включённым начальным элементом, но с исключённым конечным элементом:

NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)
NavigableMap<K,V> headMap(K toKey, boolean inclusive)
NavigableMap<K,V> tailMap(K fromKey, boolean inclusive)
SortedMap<K,V> subMap(K fromKey, K toKey)
SortedMap<K,V> headMap(K toKey)
SortedMap<K,V> tailMap(K fromKey)

5. Интерфейс Мар.Entry

Интерфейс Мар.Entry позволяет работать с элементом карты. Метод entrySet(), объявленный в интерфейсе Мар, возвращает Set, содержащий элементы карты. Каждый из элементов этого набора представляет собой объект типа Мар.Entry.

6. Класс HashMap

Класс HashMap реализует интерфейс Мар. Он использует хеш-таблицу для хранения карты. Это позволяет обеспечить константное время выполнения методов get() и put() даже при больших наборах.

Ключи и значения могут быть любых типов, в том числе и null.

HashMap обобщенный класс со следующим объявлением: 

class HashMap<K, V>

Пример 1. Использование класса HashMap

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class HashMapDemo {
    public static void main(String[] args) {
        Map<String, Double> hashMap = new HashMap<>();

        hashMap.put("Иванов", 3434.34);
        hashMap.put("Петров", 123.22);
        hashMap.put("Сидоров", 1378.00);

        Set<String> keys = hashMap.keySet();

        for (String key : keys) {
            System.out.print(key + ": ");
            System.out.println(hashMap.get(key));
        }
    }
}

7. Класс TreeMap

TreeMap – хранит элементы в порядке сортировки. TreeMap сортирует элементы по возрастанию от первого к последнему. Порядок сортировки может задаваться реализацией интерфейсов Comparator и Comparable. Реализация Comparator передается в конструктор TreeMap, Comparable используется при добавлении элемента в карту.

Конструкторы класса TreeMap:

TreeMap()
TreeMap(Comparator<? super К> сотр) 
TreeMap(Map<? extends К, ? extends V> т) 
TreeMap(SortedМap<K, ? extends V> sm) 

Пример 2. Использование класса TreeMap

import java.util.SortedMap;
import java.util.TreeMap;

public class TreeMapDemo {
    public static void main(String[] args) {
        SortedMap<String, Double> treeMap = new TreeMap<>();

        treeMap.put("Иванов", 3434.34);
        treeMap.put("Петров", 123.22);
        treeMap.put("Сидоров", 1378.00);

        treeMap.forEach((k, v) -> System.out.println(k + ": " + v));
    }
}

8. Класс LinkedHashMap

Класс LinkedHashMap расширяет HashMap. Он создает связный список элементов в карте, расположенных в том порядке, в котором они вставлялись. Это позволяет организовать итерацию по карте в порядке вставки.

8. Изменяемые объекты в качестве ключа

import java.util.HashMap;
import java.util.Map;

public class ProductKeyDemo {
    public static void main(String[] args) {
        Map<Product, String> map = new HashMap<>();
        Product doll = new Product("Кукла", 534, "Украина");
        Product box = new Product("Кубик", 34, "Украина");
        Product car = new Product("Машинка", 200, "Украина");

        map.put(doll, "Антошка");
        map.put(box, "Антошка");
        map.put(car, "Детский мир");

        System.out.println(map.get(doll));
        doll.setCost(434);

        System.out.println(map.get(doll));
    }
}
Read also:
Comments