Что такое map в java
Перейти к содержимому

Что такое map в java

  • автор:

Interfejs Map — tzw. Dictionary

Map jest interfejsem wchodzącym w skład Collections Framework Javy. W odróżnieniu od list oraz zbiorów, mapy nie implementują interfejsu Collection. Jest to związane z tym, że w mapach elementy przechowywane są w postaci par klucz-wartość, gdzie oba z tych elementów mogą być dowolnym typem obiektowym. W mapie do danego klucz może być przypisana tylko jedna wartość, gdy spróbujemy dodać kolejną wartość o tym samym kluczu to spowodujemy nadpisanie wartości już istniejącej. Przykłady to isbn-książka, pesel-osoba, id-produkt itp.

Implementacje

map treemap hashmap linkedhashmap

HashMap

Podstawowa implementacja oparta podobnie jak HashSet o tablicę mieszaną, więc podobnie jak i ona nie gwarantuje żadnej kolejności elementów.

TreeMap

Implementacja, która zapewnia dodatkowo sortowanie na podstawie naturalnego porządku kluczy wyznaczanego przez implementację interfejsu Comparable lub zdefiniowaniu dodatkowego Comparatora. Podobnie jak TreeSet, TreeMap również wykorzystuje drzewa czerwono czarne.

LinkedHashMap

Implementacja mapy, która zapewnia zapamiętywanie kolejności dodawania elementów, co może być przydatne przy iteracji. Wykorzystuje tablicę mieszaną oraz listę wiązaną

Wszystkie implementacje wymagają prawidłowej implementacji metod equals() i hashCode() w klasie definiującej klucz.

Różnica między HashSet, TreeSet i LinkedHashSet

Wybór odpowiedniej implementacji powinien być podyktowany naszą aktualną potrzebą. HashSet jest podstawową implementacją zapewnia stałą złożoność obliczeniową podstawowych operacji takich jak wstawianie i odczyt elementów. HashMap nie gwarantuje nam niestety żadnej kolejności w sytuacji gdzie będziemy iterowali po mapie. Jeśli nam na tym zależy, to powinniśmy skorzystać z TreeMapy, która sortuje elementy mapy według porządku kluczy lub LinkedHashMapy, gdy wolimy iterować po elementach w kolejności w jakiej były one do niej dodane. TreeMapa zapewnia logarytmiczną a LinkedHashMap stałą złożoność obliczeniową podstawowych operacji.

Metody

Ponieważ mapy nie implementują interfejsu Collection to nie znajdziemy tutaj np. metody add(). Zamiast tego najważniejsze z nich to:

  • put(K key, V value) — wstawia do mapy wartość ‘v’ przypisaną do klucza ‘k’
  • get(Object key) — zwraca wartość przypisaną do klucza ‘key’ lub null jeśli do takiego klucza nie jest przypisana żadna wartość
  • remove(Object key) — usuwa z mapy wartość przypisaną do klucza ‘key’
  • isEmpty() — sprawdza, czy mapa jest pusta
  • size() — zwraca rozmiar (ilość elementów) mapy
  • keySet() — zwraca zbiór kluczy
  • values() — zwraca kolekcję wartości
  • Set> entrySet() — zwraca zbiór obiektów typu Map.Entry, które reprezentują kolejne rekordy w mapie na zasadzie klucz-wartość

W TreeMap znajdziemy dodatkowe metody wynikające z implementacji takie jak firstEntry() , czy firstKey() , więcej można znaleźć w dokumentacji.

Kurs Java

Przykład

Zdefiniujmy prosty przykład, w którym stworzymy mapę przechowującą kilka wpisów reprezentujących bazę danych pewnej firmy. Rekordy przechowywane będą w niej na zasadzie par klucz-wartość, gdzie kluczami będą id pracowników a wartościami «imię nazwisko» danego pracownika. Ponieważ chcemy, aby przy wyświetlaniu pracownicy byli posortowaniu zgodnie z kolejnością kluczy, to użyjemy implementacji TreeMap.

import java.util.Collection; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; public class MapExample < public static void main(String[] args) < Mapemployees = new TreeMap<>(); employees.put(111, "Jan Kowalski"); employees.put(333, "Wojciech Kowalski"); employees.put(222, "Kasia Piotrowska"); employees.put(555, "Anna Zawadzka"); employees.put(444, "Jan Kowalski"); System.out.println("Ilość pracowników: " + employees.size()); Set keySet = employees.keySet(); System.out.println("Klucze:\n" + keySet); Collection values = employees.values(); System.out.println("Wartości:\n" + values); Set> entrySet = employees.entrySet(); for(Entry entry: entrySet) < System.out.println(entry.getKey() + " : " + entry.getValue()); >> > 

Po dodaniu kilku rekordów do mapy (zwróć uwagę, że dodajemy elementy bez zachowania kolejności kluczy), wyświetlamy kolejno

mapy konsola

  • ilość rekordów wykorzystując metodę size()
  • zbiór kluczy korzystając z metody keySet() — zwróć uwagę, że zbiór jest posortowany
  • kolekcję wartości korzystając z metody values()
  • na koniec pobieramy zbiór par klucz-wartość i wyświetlamy je w czytelnej formie

31.5. Java – Интерфейс Map

Интерфейс Map в Java отображает уникальные ключи для значений. Ключ – это объект, который вы используете, чтобы позже получить значение.

  • Имея ключ и значение, вы можете поместить значение в объект Map. После помещения значения, вы можете его получить, используя его ключ.
  • Некоторые методы генерируют исключение NoSuchElementException, когда в вызываемой карте нет элементов.
  • Исключение ClassCastException генерируется, когда объект несовместим с элементами на карте.
  • Исключение NullPointerException генерируется, когда совершается попытка использовать нулевой объект, а ноль не допустим на карте.
  • Исключение UnsupportedOperationException генерируется, когда совершается попытка изменить неизменяемую карту.

Методы

Метод и описание
1 void clear()
Удаляет все пары ключей/значений в вызываемой карте.
2 boolean containsKey(Object k)
Возвращает true, если вызываемая карта содержит k как ключ. В противном случае, возвращает false.
3 boolean containsValue(Object v)
Возвращает true, если карта содержит v как значение. В противном случае, возвращает false.
4 Set entrySet()
Возвращает набор, содержащий записи на карте. Набор содержит объекты типа Map.Entry. Этот метод обеспечивает просмотр набора вызывающей карты.
5 boolean equals(Object obj)
Возвращает true, если obj является Map и содержит одинаковые записи. В противном случае, возвращает false.
6 Object get(Object k)
Возвращает значение, связанное с ключом k.
7 int hashCode()
Возвращает хэш-код для вызываемой карты.
8 boolean isEmpty()
Возвращает true, если вызываемая карта пустая. В противном случае, возвращает false.
9 Set keySet()
Возвращает набор, который содержит ключи в вызываемой карте. Этот метод предоставляет набор ключей на вызывающей карте.
10 Object put(Object k, Object v)
Вставляет запись в вызываемую карту, перезаписывая любое предыдущее значение, связанное с ключом. Ключ и значения соответствуют k и v. Возвращает ноль, если ключ ещё не существует. В противном случае возвращается предыдущее значение, связанное с ключом.
11 void putAll(Map m)
Вставляет все записи из m в эту карту.
12 Object remove(Object k)
Удаляет запись, чей ключ равен k.
13 int size()
Возвращает количество пар ключей/значений в карте.
14 Collection values()
Возвращает коллекцию значений в карте. Этот метод предоставляет просмотр значений в карте.

Пример

В Java Map имеет своё реализацию в различных классах, таких как HashMap. Следующее – пример, объясняющий функционал карты.

import java.util.*; public class CollectionsDemo < public static void main(String[] args) < Map m1 = new HashMap(); m1.put("Маша", "8"); m1.put("Михаил", "31"); m1.put("Олег", "12"); m1.put("Денис", "14"); System.out.println(); System.out.println("Элементы карты"); System.out.print("\t" + m1); >> 
Элементы карты

Оглавление

  • 1. Java – Самоучитель для начинающих
  • 2. Java – Обзор языка
  • 3. Java – Установка и настройка
  • 4. Java – Синтаксис
  • 5. Java – Классы и объекты
  • 6. Java – Конструкторы
  • 7. Java – Типы данных и литералы
  • 8. Java – Типы переменных
  • 9. Java – Модификаторы
  • 10. Java – Операторы
  • 11. Java – Циклы и операторы цикла
  • 11.1. Java – Цикл while
  • 11.2. Java – Цикл for
  • 11.3. Java – Улучшенный цикл for
  • 11.4. Java – Цикл do..while
  • 11.5. Java – Оператор break
  • 11.6. Java – Оператор continue
  • 12. Java – Операторы принятия решений
  • 12.1. Java – Оператор if
  • 12.2. Java – Оператор if..else
  • 12.3. Java – Вложенный оператор if
  • 12.4. Java – Оператор switch..case
  • 12.5. Java – Условный оператор (? 🙂
  • 13. Java – Числа
  • 13.1. Java – Методы byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()
  • 13.2. Java – Метод compareTo()
  • 13.3. Java – Метод equals()
  • 13.4. Java – Метод valueOf()
  • 13.5. Java – Метод toString()
  • 13.6. Java – Метод parseInt()
  • 13.7. Java – Метод Math.abs()
  • 13.8. Java – Метод Math.ceil()
  • 13.9. Java – Метод Math.floor()
  • 13.10. Java – Метод Math.rint()
  • 13.11. Java – Метод Math.round()
  • 13.12. Java – Метод Math.min()
  • 13.13. Java – Метод Math.max()
  • 13.14. Java – Метод Math.exp()
  • 13.15. Java – Метод Math.log()
  • 13.16. Java – Метод Math.pow()
  • 13.17. Java – Метод Math.sqrt()
  • 13.18. Java – Метод Math.sin()
  • 13.19. Java – Метод Math.cos()
  • 13.20. Java – Метод Math.tan()
  • 13.21. Java – Метод Math.asin()
  • 13.22. Java – Метод Math.acos()
  • 13.23. Java – Метод Math.atan()
  • 13.24. Java – Метод Math.atan2()
  • 13.25. Java – Метод Math.toDegrees()
  • 13.26. Java – Метод Math.toRadians()
  • 13.27. Java – Метод Math.random()
  • 14. Java – Символы
  • 14.1. Java – Метод Character.isLetter()
  • 14.2. Java – Метод Character.isDigit()
  • 14.3. Java – Метод Character.isWhitespace()
  • 14.4. Java – Метод Character.isUpperCase()
  • 14.5. Java – Метод Character.isLowerCase()
  • 14.6. Java – Метод Character.toUpperCase()
  • 14.7. Java – Метод Character.toLowerCase()
  • 14.8. Java – Метод Character.toString()
  • 15. Java – Строки
  • 15.1. Java – Метод charAt()
  • 15.2. Java – Метод compareTo()
  • 15.3. Java – Метод compareToIgnoreCase()
  • 15.4. Java – Метод concat()
  • 15.5. Java – Метод contentEquals()
  • 15.6. Java – Метод copyValueOf()
  • 15.7. Java – Метод endsWith()
  • 15.8. Java – Метод equals()
  • 15.9. Java – Метод equalsIgnoreCase()
  • 15.10. Java – Метод getBytes()
  • 15.11. Java – Метод getChars()
  • 15.12. Java – Метод hashCode()
  • 15.13. Java – Метод indexOf()
  • 15.14. Java – Метод intern()
  • 15.15. Java – Метод lastIndexOf()
  • 15.16. Java – Метод length()
  • 15.17. Java – Метод matches()
  • 15.18. Java – Метод regionMatches()
  • 15.19. Java – Метод replace()
  • 15.20. Java – Метод replaceAll()
  • 15.21. Java – Метод replaceFirst()
  • 15.22. Java – Метод split()
  • 15.23. Java – Метод startsWith()
  • 15.24. Java – Метод subSequence()
  • 15.25. Java – Метод substring()
  • 15.26. Java – Метод toCharArray()
  • 15.27. Java – Метод toLowerCase()
  • 15.28. Java – Метод toString()
  • 15.29. Java – Метод toUpperCase()
  • 15.30. Java – Метод trim()
  • 15.31. Java – Метод valueOf()
  • 15.32. Java – Классы StringBuilder и StringBuffer
  • 15.32.1. Java – Метод append()
  • 15.32.2. Java – Метод reverse()
  • 15.32.3. Java – Метод delete()
  • 15.32.4. Java – Метод insert()
  • 15.32.5. Java – Метод replace()
  • 16. Java – Массивы
  • 17. Java – Дата и время
  • 18. Java – Регулярные выражения
  • 19. Java – Методы
  • 20. Java – Потоки ввода/вывода, файлы и каталоги
  • 20.1. Java – Класс ByteArrayInputStream
  • 20.2. Java – Класс DataInputStream
  • 20.3. Java – Класс ByteArrayOutputStream
  • 20.4. Java – Класс DataOutputStream
  • 20.5. Java – Класс File
  • 20.6. Java – Класс FileReader
  • 20.7. Java – Класс FileWriter
  • 21. Java – Исключения
  • 21.1. Java – Встроенные исключения
  • 22. Java – Вложенные и внутренние классы
  • 23. Java – Наследование
  • 24. Java – Переопределение
  • 25. Java – Полиморфизм
  • 26. Java – Абстракция
  • 27. Java – Инкапсуляция
  • 28. Java – Интерфейсы
  • 29. Java – Пакеты
  • 30. Java – Структуры данных
  • 30.1. Java – Интерфейс Enumeration
  • 30.2. Java – Класс BitSet
  • 30.3. Java – Класс Vector
  • 30.4. Java – Класс Stack
  • 30.5. Java – Класс Dictionary
  • 30.6. Java – Класс Hashtable
  • 30.7. Java – Класс Properties
  • 31. Java – Коллекции
  • 31.1. Java – Интерфейс Collection
  • 31.2. Java – Интерфейс List
  • 31.3. Java – Интерфейс Set
  • 31.4. Java – Интерфейс SortedSet
  • 31.5. Java – Интерфейс Map
  • 31.6. Java – Интерфейс Map.Entry
  • 31.7. Java – Интерфейс SortedMap
  • 31.8. Java – Класс LinkedList
  • 31.9. Java – Класс ArrayList
  • 31.10. Java – Класс HashSet
  • 31.11. Java – Класс LinkedHashSet
  • 31.12. Java – Класс TreeSet
  • 31.13. Java – Класс HashMap
  • 31.14. Java – Класс TreeMap
  • 31.15. Java – Класс WeakHashMap
  • 31.16. Java – Класс LinkedHashMap
  • 31.17. Java – Класс IdentityHashMap
  • 31.18. Java – Алгоритмы Collection
  • 31.19. Java – Iterator и ListIterator
  • 31.20. Java – Comparator
  • 32. Java – Дженерики
  • 33. Java – Сериализация
  • 34. Java – Сеть
  • 34.1. Java – Обработка URL
  • 35. Java – Отправка Email
  • 36. Java – Многопоточность
  • 36.1. Java – Синхронизация потоков
  • 36.2. Java – Межпоточная связь
  • 36.3. Java – Взаимная блокировка потоков
  • 36.4. Java – Управление потоками
  • 37. Java – Основы работы с апплетами
  • 38. Java – Javadoc

Что такое map в java

Интерфейс Map представляет отображение или иначе говоря словарь, где каждый элемент представляет пару «ключ-значение». При этом все ключи уникальные в рамках объекта Map. Такие коллекции облегчают поиск элемента, если нам известен ключ — уникальный идентификатор объекта.

Следует отметить, что в отличие от других интерфейсов, которые представляют коллекции, интерфейс Map НЕ расширяет интерфейс Collection.

Среди методов интерфейса Map можно выделить следующие:

  • void clear() : очищает коллекцию
  • boolean containsKey(Object k) : возвращает true, если коллекция содержит ключ k
  • boolean containsValue(Object v) : возвращает true, если коллекция содержит значение v
  • Set> entrySet() : возвращает набор элементов коллекции. Все элементы представляют объект Map.Entry
  • boolean equals(Object obj) : возвращает true, если коллекция идентична коллекции, передаваемой через параметр obj
  • boolean isEmpty : возвращает true, если коллекция пуста
  • V get(Object k) : возвращает значение объекта, ключ которого равен k. Если такого элемента не окажется, то возвращается значение null
  • V getOrDefault(Object k, V defaultValue) : возвращает значение объекта, ключ которого равен k. Если такого элемента не окажется, то возвращается значение defaultVlue
  • V put(K k, V v) : помещает в коллекцию новый объект с ключом k и значением v. Если в коллекции уже есть объект с подобным ключом, то он перезаписывается. После добавления возвращает предыдущее значение для ключа k, если он уже был в коллекции. Если же ключа еще не было в коллекции, то возвращается значение null
  • V putIfAbsent(K k, V v) : помещает в коллекцию новый объект с ключом k и значением v, если в коллекции еще нет элемента с подобным ключом.
  • Set keySet() : возвращает набор всех ключей отображения
  • Collection values() : возвращает набор всех значений отображения
  • void putAll(Map map) : добавляет в коллекцию все объекты из отображения map
  • V remove(Object k) : удаляет объект с ключом k
  • int size() : возвращает количество элементов коллекции

Чтобы положить объект в коллекцию, используется метод put , а чтобы получить по ключу — метод get . Реализация интерфейса Map также позволяет получить наборы как ключей, так и значений. А метод entrySet() возвращает набор всех элементов в виде объектов Map.Entry .

Обобщенный интерфейс Map.Entry представляет объект с ключом типа K и значением типа V и определяет следующие методы:

  • boolean equals(Object obj) : возвращает true, если объект obj, представляющий интерфейс Map.Entry , идентичен текущему
  • K getKey() : возвращает ключ объекта отображения
  • V getValue() : возвращает значение объекта отображения
  • V setValue(V v) : устанавливает для текущего объекта значение v
  • int hashCode() : возвращает хеш-код данного объекта

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

Классы отображений. HashMap

Базовым классом для всех отображений является абстрактный класс AbstractMap , который реализует большую часть методов интерфейса Map. Наиболее распространенным классом отображений является HashMap , который реализует интерфейс Map и наследуется от класса AbstractMap.

Пример использования класса:

import java.util.*; public class Program < public static void main(String[] args) < Mapstates = new HashMap(); states.put(1, "Germany"); states.put(2, "Spain"); states.put(4, "France"); states.put(3, "Italy"); // получим объект по ключу 2 String first = states.get(2); System.out.println(first); // получим весь набор ключей Set keys = states.keySet(); // получить набор всех значений Collection values = states.values(); //заменить элемент states.replace(1, "Poland"); // удаление элемента по ключу 2 states.remove(2); // перебор элементов for(Map.Entry item : states.entrySet()) < System.out.printf("Key: %d Value: %s \n", item.getKey(), item.getValue()); >Map people = new HashMap(); people.put("1240i54", new Person("Tom")); people.put("1564i55", new Person("Bill")); people.put("4540i56", new Person("Nick")); for(Map.Entry item : people.entrySet()) < System.out.printf("Key: %s Value: %s \n", item.getKey(), item.getValue().getName()); >> > class Person < private String name; public Person(String value)< name=value; >String getName() >

Чтобы добавить или заменить элемент, используется метод put, либо replace, а чтобы получить его значение по ключу — метод get. С помощью других методов интерфейса Map также производятся другие манипуляции над элементами: перебор, получение ключей, значений, удаление.

Map (Отображение)

В контейнерах Map (отображение) хранятся два объекта: ключ и связанное с ним значение. Иногда используют термин «ассоциативный массив» или «словарь».

Map позволяет искать объекты по ключу. Объект, ассоциированный с ключом, называется значением. И ключи, и значения являются объектами. Ключи могут быть уникальными, а значения могут дублироваться. Некоторые отображения допускают пустые ключи и пустые значения.

Классы для карт:

  • AbstractMap — абстрактный класс, реализующий большую часть интерфейса Map
  • EnumMap — расширяет класс AbstractMap для использования с ключами перечислимого типа enum
  • HashMap — структура данных для хранения связанных вместе пар «ключ-значение», применяется для использования хеш-таблицы
  • TreeMap — для использования дерева, т.е. отображение с отсортированными ключами
  • WeakHashMap — для использования хеш-таблицы со слабыми ключами, отображение со значениями, которые могут удаляться сборщиком мусора, если они больше не используются
  • LinkedHashMap — отображение с запоминанием порядка, в котором добавлялись элементы, разрешает перебор в порядке вставки
  • IdentityHashMap — использует проверку ссылочной эквивалентности при сравнении документов, отображение с ключами, сравниваемыми с помощью операции == вместо метода equals()

Метод toString() выводит содержимое в виде фигурных скобок, где ключи и значения разделяются знаком равенства. Ключи слева, значения справа.

Отображения не поддерживают реализацию интерфейса Iterable, поэтому нельзя перебрать карту через цикл for в форме for-each.

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

 interface Map

В параметре K указывается тип ключей, в V — тип хранимых значений.

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

Основные методы — get() и put(), чтобы получить или поместить значения в отображение.

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

Интерфейс NavigableMap (Java 7) расширяет интерфейс Sortedmap и определяет поведение отображения, поддерживающее извлечение элементов на основе ближайшего соответствия заданному ключу или ключам.

Интерфейс Map.Entry позволяет работать с элементом отображения.

HashMap обеспечивает максимальную скорость выборки, а порядок хранения его элементов не очевиден. TreeMap хранит ключи отсортированными по возрастанию, а LinkedHashMap хранит ключи в порядке вставки, но не обеспечивает скорость поиска HashMap.

В Android 11 (R) обещают добавить несколько перегруженных версий метода of(), которые являются частью Java 8.

В Android 11 (R) обещают добавить методы ofEntries() и entry(), которые являются частью Java 8.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *