Map entry java что это
Перейти к содержимому

Map entry java что это

  • автор:

Map entry java что это

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

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

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

void clear() : очищает коллекцию

boolean containsKey(Object k) : возвращает true, если коллекция содержит ключ k

boolean containsValue(Object v) : возвращает true, если коллекция содержит значение v

Set<Map.Entry<K, V>> 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<K> keySet() : возвращает набор всех ключей отображения

Collection<V> values() : возвращает набор всех значений отображения

void putAll(Map<? extends K, ? extends V> map) : добавляет в коллекцию все объекты из отображения map

V remove(Object k) : удаляет объект с ключом k

int size() : возвращает количество элементов коллекции

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

Обобщенный интерфейс Map.Entry<K, V> представляет объект с ключом типа 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.

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

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

Использование Java-класса Map.Entry

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

В этом уроке мы сравним различные методы итерации карт, выделив, когда может быть полезно использовать Map.Entry . Затем мы узнаем, как Map.Entry можно использовать для создания кортежа. Наконец, мы создадим упорядоченный список кортежей.

2. Оптимизация итерации Карты

Предположим, что у нас есть карта названий книг с именем автора в качестве ключа:

Давайте сравним два метода получения всех ключей и значений с нашей карты.

2.1. Использование Map.keySet

Во-первых, рассмотрим следующее:

Здесь цикл повторяет набор ключей . Для каждого ключа мы получаем соответствующее значение, используя Map.get . Хотя это очевидный способ использовать все записи на карте, для каждой записи требуется две операции: одна для получения следующего ключа и одна для поиска значения с помощью get .

Если нам нужны только ключи на карте, keySet – хороший вариант. Однако есть более быстрый способ получить как ключи, так и значения.

2.2. Использование Map.entrySet Вместо

Давайте перепишем нашу итерацию, чтобы использовать entrySet :

В этом примере наш цикл выполняется над коллекцией объектов Map.Entry . Поскольку Map.Entry хранит ключ и значение вместе в одном классе, мы получаем их оба в одной операции .

Те же правила применяются к с использованием потоковых операций Java 8 . Потоковая передача по entrySet и работа с Entry объектами более эффективна и может потребовать меньше кода.

3. Работа С Кортежами

Кортеж-это структура данных с фиксированным числом и порядком элементов. Мы можем думать о Map.Entry – это кортеж, в котором хранятся два элемента-ключ и значение. Однако, поскольку Map.Entry является интерфейсом, нам требуется класс реализации. В этом разделе мы рассмотрим одну реализацию, предоставленную JDK: AbstractMap.SimpleEntry .

3.1. Создание кортежа

Во-первых, рассмотрим класс Book :

Далее давайте создадим кортеж Map.Entry с ISBN в качестве ключа и объектом Book в качестве значения:

Наконец, давайте создадим экземпляр нашего кортежа с помощью AbstractMap.SimpleEntry :

3.2. Создание упорядоченного списка кортежей

При работе с кортежами часто полезно иметь их в виде упорядоченного списка.

Сначала мы определим наш список кортежей:

Во-вторых, давайте добавим несколько записей в наш список:

3.3. Сравнение С Картой

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

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

Наконец, давайте посмотрим на результат:

Обратите внимание, что у нас могут быть дубликаты ключей , в отличие от базовой Карты , где каждый ключ должен быть уникальным. Это связано с тем, что мы использовали реализацию List для хранения наших объектов Simple Entry , что означает, что все объекты независимы друг от друга.

3.4. Списки объектов ввода

Следует отметить, что цель Entry не состоит в том, чтобы действовать как общий кортеж. Библиотечные классы часто предоставляют общую пару класс для этой цели.

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

4. Заключение

В этой статье мы рассмотрели Map.entrySet как альтернативу перебору ключей карты.

Затем мы рассмотрели, как Map.Entry можно использовать в качестве кортежа.

Наконец, мы создали список упорядоченных кортежей, сравнив различия с базовой Картой .

What is Map.Entry<K,V> interface?

What does Map.Entry<K,V> mean ? What is the entry object ?

I read that the method entrySet returns a set view of the map. But I do not understand this initialization in for-each loop.

4 Answers 4

Map.Entry is a key/value pair that forms one element of a Map . See the docs for more details.

You typically would use this with:

If you need to process each key/value pair, this is more efficient than iterating over the key set and calling get(key) to get each value.

Ted Hopp's user avatar

Map.Entry is an object that represents one entry in a map. (A standard map has 1 value for every 1 key.) So, this code will iterator over all key-value pairs.

You might print them out:

Nicole's user avatar

An entry is a key/value pair. In this case, it is a mapping of Integers to VmAllocation objects.

A map entry (key-value pair). The Map.entrySet method returns a collection-view of the map, whose elements are of this class. The only way to obtain a reference to a map entry is from the iterator of this collection-view. These Map.Entry objects are valid only for the duration of the iteration; more formally, the behavior of a map entry is undefined if the backing map has been modified after the entry was returned by the iterator, except through the setValue operation on the map entry.

RevanthKrishnaKumar V.'s user avatar

You can learn about Map.Entry Docs

A map entry (key-value pair). The Map.entrySet method returns a collection-view of the map, whose elements are of this class. The only way to obtain a reference to a map entry is from the iterator of this collection-view. These Map.Entry objects are valid only for the duration of the iteration; more formally, the behavior of a map entry is undefined if the backing map has been modified after the entry was returned by the iterator, except through the setValue operation on the map entry.

entry is a variable of type Map.Entry which is instantiated with the Entry type data in allMap with each iteration.

    The Overflow Blog
Related
Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.6.8.43486

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Name already in use

JBook / collections / map / intro.md

  • Go to file T
  • Go to line L
  • Copy path
  • Copy permalink
  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

Как уже было сказано во введении, интерфейс java.util.Map не связан с java.util.Collection , однако формально является коллекцией.

По сути, это коллекция пар ‘ключ -> значение’, а java.util.Map — это интерфейс ассоциативного массива. Каждому ключу соответствует значение.

Реализации java.util.Map также могут называть мапами или хэш-таблицами, а в Python это называется словарь.

Вопрос:

Почему бы тогда не назвать просто словарь ? Как это сделано в Python ?

Ответ:

На самом деле в Java существует абстрактный класс java.util.Dictionary еще с версии 1.0 . Cейчас этот класс является устаревшим, о чем свидетельствует его java doc :

This class is obsolete. New implementations should implement the Map interface, rather than extending this class.

Из-за минусов использования наследования новую иерархию начали строить с интерфейсов.

Интерфейс java.util.Map появился в Java начиная с версии 1.2 .

Название Map появилось как сокращение слова mapping , что значит отображение/соответствие.

Объявление java.util.Map выглядит как:

Здесь K — это параметризация ключа, а V , соответственно, значения.

Основные методы, которые предоставляет интерфейс java.util.Map :

  • V get(Object key)
  • V put(K key, V value)
  • V remove(Object key)
  • Set<K> keySet()
  • Collection<V> values()
  • Set<Map.Entry<K, V>> entrySet()

Это значит, что все реализации интерфейса java.util.Map позволяют доставать, добавлять и удалять элементы по ключам, а также предоставлять множество ключей и коллекцию хранимых значений.

Отдельного рассмотрения заслуживает последний метод: Set<Map.Entry<K, V>> entrySet() .

Как уже было сказано выше, мы работаем с набором пар ключ-значение.

Интерфейс, описывающий поведение такой пары, называется Entry и объявлен внутри java.util.Map .

Объявление java.util.Map#Entry выглядит как:

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

При этом обратите внимание, что setValue , в отличии от канонических setter- ов, возвращает старое замененное значение.

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

У каждого класса, реализующего интерфейс java.util.Map своя реализация java.util.Map#Entry , но большинство из них основано на стандартной реализации, которая объявлена у java.util.HashMap :

В этой реализации нет каких-то подводных камней и сложностей, кроме того, что она объявлена с модификатором доступа package . Ее использование ограничено в рамках пакета, в классе которого она объявлена, т.е. java.util .

Стандартная реализация, доступная для использования везде, объявлена у java.util.AbstractMap и называется SimpleEntry :

Там же объявлена и неизменяемая (immutable) реализация SimpleImmutableEntry .

Еще существуют сторонние реализации java.util.Map#Entry , например, в библиотеке Apache Commons .

Иерархия классов выглядит следующим образом:

Class hierarchy

Абстрактный класс java.util.AbstractMap предоставляет заготовку для последующих реализаций.

В нем уже определены некоторые методы, достаточные для неизменяемой структуры данных, но такие методы как put кидают исключение java.lang.UnsupportedOperationException . Это значит, что операция не поддерживется и ее надо либо не использовать, либо переопределить метод.

Наиболее известные реализации java.util.Map :

    — основана на хэш-таблицах. — расширение предыдущей реализации на основе двусвязных списков. — основана на красно-черном дереве.

Помимо этого, существует также давно устаревшая реализация java.util.HashTable , использование которой не рекомендуется.

Когда и какую реализацию выбрать?

Если порядок хранения элементов не важен, то выбор java.util.HashMap более чем оправдан.

Данная реализация предоставляет отличную производительность работы с базовыми методами(добавление, поиск, удаление): O(1) , но при условии отсутствия коллизий, т.е хорошо определенной хэш-функции добавляемых элементов, в Java за это отвечает метод hashCode.

В случае, если порядок добавления элементов важен, то стоит рассмотреть java.util.LinkedHashMap . Понятно, что за сохранение порядка надо платить, поэтому данная реализация работает медленнее, чем java.util.HashMap .

Минусом может также являться то, что и java.util.HashMap , и java.util.LinkedHashMap занимают в памяти больше места, чем хранят элементов, в отличии от java.util.TreeMap .

Если необходимо, чтобы элементы были отсортированы, то следует присмотреться к java.util.TreeMap . Однако в таком случае добавляемые элементы должны либо реализовывать интерфейс java.lang.Comparable , либо необходимо написать свой собственный компаратор.

Помните, что java.util.TreeMap не поддерживает работу с null ключами.

Структура данных Производительность (basic ops) Память Отсортированность элементов Работа с null
Treemap O(log(N)) Без издержек В естественном порядке Недопустимы null ключи, без ограничений на null значения
HashMap O(1) С издержками Неотсортирован Допустим null ключ, без ограничений на null значения
Linked HashMap O(1) (но медленнее HashMap) Также как и в HashMap В порядке добавления Допустим null ключ, без ограничений на null значения

Реализации java.util.Map имеют встроенные итераторы. Получить можно как список всех ключей keySet() или всех значений values() , так и все пары ключ-значение entrySet() .

При этом следует помнить, что порядок гарантируеутся не всеми реализациями, как например в примере выше.

Стоит помнить, что, как и в случае с итерированием сипсков, если в ходе работы итератора структура данных была изменена (без использования методов итератора), то будет выброшено исключение:

Избежать этого можно удаляя элемент с помощью итератора, с которым происходит работа:

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

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