Map entry 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 также производятся другие манипуляции над элементами: перебор, получение ключей, значений, удаление.
Использование Java-класса Map.Entry
Мы часто используем карты для хранения набора пар ключ-значение. Затем, в какой-то момент, нам часто нужно перебирать их .
В этом руководстве мы сравним различные методы итерации карты, выделив, когда может быть полезно использовать Map.Entry . Затем мы узнаем, как можно использовать Map.Entry для создания кортежа. Наконец, мы создадим упорядоченный список кортежей.
2. Оптимизация итерации карты
Предположим, что у нас есть карта названий книг с именем автора в качестве ключа:
MapString, String> map = new HashMap>(); map.put("Robert C. Martin", "Clean Code"); map.put("Joshua Bloch", "Effective Java");
Давайте сравним два метода получения всех ключей и значений из нашей карты.
2.1. Использование Map.keySet
Во-первых, рассмотрите следующее:
for (String key : bookMap.keySet()) System.out.println("key: " + key + " value: " + bookMap.get(key)); >
Здесь цикл перебирает набор ключей . Для каждого ключа мы получаем соответствующее значение с помощью Map.get . Хотя это очевидный способ использовать все записи на карте, для каждой записи требуется две операции — одна для получения следующего ключа и одна для поиска значения с помощью get .
Если нам нужны только ключи на карте, keySet — хороший вариант. Однако есть более быстрый способ получить как ключи, так и значения.
2.2. Использование Map.entrySet вместо этого
Давайте перепишем нашу итерацию, чтобы использовать entrySet :
for (Map.EntryString, String> book: bookMap.entrySet()) System.out.println("key: " + book.getKey() + " value: " + book.getValue()); >
В этом примере наш цикл проходит по коллекции объектов Map.Entry . Поскольку Map.Entry хранит и ключ, и значение вместе в одном классе, мы получаем их оба в одной операции .
Те же правила применяются к использованию потоковых операций Java 8 . Потоковая передача через entrySet и работа с объектами Entry более эффективны и могут потребовать меньше кода.
3. Работа с кортежами
Кортеж — это структура данных с фиксированным количеством и порядком элементов. Мы можем думать о Map.Entry как о кортеже, который хранит два элемента — ключ и значение. Однако, поскольку Map.Entry — это интерфейс, нам требуется класс реализации. В этом разделе мы рассмотрим одну реализацию, предоставляемую JDK: AbstractMap.SimpleEntry .
3.1. Создание кортежа
Сначала рассмотрим класс Book :
public class Book private String title; private String author; public Book(String title, String author) this.title = title; this.author = author; > ...
Далее создадим кортеж Map.Entry с ISBN в качестве ключа и объектом Book в качестве значения:
Map.EntryString, Book> tuple;
Наконец, давайте создадим экземпляр нашего кортежа с помощью AbstractMap.SimpleEntry :
tuple = new AbstractMap.SimpleEntry>("9780134685991", new Book("Effective Java 3d Edition", "Joshua Bloch"));
3.2. Создание упорядоченного списка кортежей
При работе с кортежами часто полезно иметь их в виде упорядоченного списка.
Во-первых, мы определим наш список кортежей:
ListMap.EntryString, Book>> orderedTuples = new ArrayList>();
Во-вторых, давайте добавим несколько записей в наш список:
orderedTuples.add(new AbstractMap.SimpleEntry>("9780134685991", new Book("Effective Java 3d Edition", "Joshua Bloch"))); orderedTuples.add(new AbstractMap.SimpleEntry>("9780132350884", new Book("Clean Code","Robert C Martin")));
3.3. Сравнение с картой
Чтобы сравнить различия с Map , давайте добавим новую запись с уже существующим ключом:
orderedTuples.add(new AbstractMap.SimpleEntry>("9780132350884", new Book("Clean Code", "Robert C Martin")));
Во-вторых, мы пройдемся по нашему списку, отображая все ключи и значения:
for (Map.EntryString, Book> tuple : orderedTuples) System.out.println("key: " + tuple.getKey() + " value: " + tuple.getValue()); >
Наконец, давайте посмотрим на вывод:
key: 9780134685991 value: Booktitle='Effective Java 3d Edition', author='Joshua Bloch'> key: 9780132350884 value: Booktitle='Clean Code', author='Robert C Martin'> key: 9780132350884 value: Booktitle='Clean Code', author='Robert C Martin'>
Обратите внимание, что у нас могут быть повторяющиеся ключи, в отличие от базовой карты , где каждый ключ должен быть уникальным. Это связано с тем, что мы использовали реализацию List для хранения наших объектов SimpleEntry , что означает, что все объекты независимы друг от друга.
3.4. Списки объектов входа
Следует отметить, что Entry не предназначен для использования в качестве универсального кортежа. Классы библиотеки часто предоставляют для этой цели универсальный « класс Pair .
Однако мы можем обнаружить, что нам нужно временно работать со списками записей при подготовке данных для Карты или извлечении данных из нее.
4. Вывод
В этой статье мы рассмотрели Map.entrySet как альтернативу перебору ключей карты.
Затем мы рассмотрели, как Map.Entry можно использовать в качестве кортежа.
Наконец, мы создали список упорядоченных кортежей, сравнивая различия с базовой картой .
Как всегда, код примера доступен на GitHub .
- 1. Обзор
- 2. Оптимизация итерации карты
- 2.1. Использование Map.keySet
- 2.2. Использование Map.entrySet вместо этого
- 3.1. Создание кортежа
- 3.2. Создание упорядоченного списка кортежей
- 3.3. Сравнение с картой
- 3.4. Списки объектов входа
Map entry java что это
Запись карты (пара ключ/значение). Метод Map.entrySet возвращает представление набора карты, элементы которой имеют этот класс. Единственный способ получить ссылку на запись карты от iterator этого представления набора. Эти объекты Map.Entry допустимы только для продолжительности итерации; более формально поведение записи карты неопределено, если отступающая карта была изменена после того, как запись была возвращена iterator, кроме через работу setValue на записи карты.
Сводка метода
Методы
Модификатор и Тип Метод и Описание boolean equals(Object o) Сравнивает указанный объект с этой записью для равенства.
Возвращает ключ, соответствующий этой записи.
Возвращает значение, соответствующее этой записи.
Возвращает значение хэш-кода для этой записи карты.
Заменяет значение, соответствующее этой записи с указанным значением (дополнительная работа).Деталь метода
getKey
K getKey()
Возвращает ключ, соответствующий этой записи.
getValue
V getValue()
Возвращает значение, соответствующее этой записи. Если отображение было удалено из отступающей карты (работой remove iterator), результаты этого вызова неопределены.
setValue
V setValue(V value)
Заменяет значение, соответствующее этой записи с указанным значением (дополнительная работа). (Записи через к карте.) Поведение этого вызова неопределено, если отображение было уже удалено из карты (работой remove iterator).
равняется
Сравнивает указанный объект с этой записью для равенства. Возвраты true, если данный объект является также записью карты и этими двумя записями, представляют то же самое отображение. Более формально две записи e1 и e2 представляют то же самое отображение если
(e1.getKey()==null ? e2.getKey()==null : e1.getKey().equals(e2.getKey())) && (e1.getValue()==null ? e2.getValue()==null : e1.getValue().equals(e2.getValue()))
Это гарантирует, что метод equals работает должным образом через различные реализации интерфейса Map.Entry.
хэш-код
int hashCode()
Возвращает значение хэш-кода для этой записи карты. Хэш-код записи карты e определяется, чтобы быть:
(e.getKey()==null ? 0 : e.getKey().hashCode()) ^ (e.getValue()==null ? 0 : e.getValue().hashCode())
Это гарантирует, что e1.equals(e2) подразумевает что e1.hashCode()==e2.hashCode() для любых двух Записей e1 и e2, как требуется согласно общему контракту Object.hashCode.
Платформа Java™
Стандарт Эд. 7Представьте ошибку или функцию
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE . Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.Что тут происходит Set> entrySet()?
Суть полиморфизма состоит в том, что за некоторым интерфейсом, можно скрыть детали реализации.
Например мы хотим создать стек, его упрощённый интерфейс будет выглядеть следующим образом:
public interface Stack
Какие реализации можно предложить? На самом деле их множество, можно использовать ArrayList , можно использовать массив, если мы, допустим, знаем максимальный размер. Возможно вы захотите использовать LinkedList . Однако задайте вопрос, при использовании стека вам нужно знать какая именно реализация скрывается за этим интерфейсом? Скорее всего нет, вы просто знаете, что есть методы add и pop , а как элементы расположатся в памяти, вас не волнует. Вы просто используете стек.
public static void main(String[] args) < Stackstack = new MyStackLinkedList(); processing(stack); Stack stack2 = new MyStackArrayList(); processing(stack); > //метод не знает, какая именно реализация используется, но ему достаточно знать об add и pop public static void processing(Stack stack)
Также и в случае Map.Entry , конкретная реализация скрыта, вдруг мы поймём как оптимизировать HashMap в будущем, для обратной совместимости всех продуктов, нам будет достаточно изменить или написать новую реализацию Node , но весь остальной код, менять не придётся.
Отслеживать
ответ дан 4 мая 2021 в 10:02
12.1k 2 2 золотых знака 25 25 серебряных знаков 47 47 бронзовых знаковvar test = new HashMap
(); Map.Entry ptr = (Map.Entry) test; Так не будет работать( примерно понял, но где то что то не понимаю. 4 мая 2021 в 10:37
hashmap не реализует интерфейс Map.Entry, Node реализует.
4 мая 2021 в 17:30EntrySet — это значения Map (тоесть ключ-значение). Каждая пара ключ-значение представляет собой Entry. Что вообще такое map — это ассоциативный массив, в котором (конкретно в реализации HashMap) по хешу ключа ищется значение. Если возникла коллизия и хеш коды ключей совпадают, значения по этому хешу складываются в односвязный список (до 8 элементов, потом превращается в красно черное дерево, но при норм определении хеш функции такое не происходит, плюс loadfactor частично предотвращает такие ситуэйшн, кароче мелочей много и мы их пока опустим) Но как мы видим, Set и Map это разные коллекции, но не концептуально. Дело в том, что Set под капотом использует Map — наш ассоциативный массив, только в качестве значений он оставляет null. Поэтому, если мы говорим о реализации HashSet в java и почему эта структура данных работает за постоянное O(1) время (при извлечении ключа), то это тот же ассоциативный масчив — Entry, просто ключ — уникальное K, а V — null, и когда мы просим отдать нам такой-то элемент, он заранее знает, на каком индексе он лежит (он вызывает функцию hashCode() класса Object и по модулю деления на длину этого массива определяет на какой ячейке он лежит — тоесть, допустим, hashCode вернул 31, а начальная емность HashSet у нас 16 — > значит мы делаем 31%16=15(остаток от деления). В 15 ячейке нашего массива и лежит наш элемент. И, когда мы его достаем, мы его не ищем, а тупо к нему обращаемся, отсюда и скорость работы)
Но если подвести итоги — то Set просто под капотом юзает Map (обратите внимание, map не реализует iterable, в отличие от set, но getValues() и getKeys() методы мапы реализуют)
Отслеживать
ответ дан 4 мая 2021 в 10:08
408 2 2 серебряных знака 17 17 бронзовых знаков- java
- интерфейс
- java-hashmap
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.