РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
419 of 1163 menu

Класс IdentityHashMap

Класс IdentityHashMap представляет собой реализацию интерфейса Map, которая при сравнении ключей использует ссылочное равенство (оператор ==), а не метод equals. Это означает, что два ключа считаются одинаковыми только в том случае, если они ссылаются на один и тот же объект в памяти. В первый параметр метода put мы передаем ключ, во второй - значение. Класс особенно полезен при работе с объектами, для которых метод equals может возвращать true для разных экземпляров, но которые должны храниться как разные ключи.

Синтаксис

IdentityHashMap<K, V> map = new IdentityHashMap<>();

Пример

Давайте создадим две строки с одинаковым содержимым и добавим их в IdentityHashMap в качестве ключей:

import java.util.IdentityHashMap; public class Main { public static void main(String[] args) { IdentityHashMap<String, Integer> map = new IdentityHashMap<>(); String key1 = new String("abcde"); String key2 = new String("abcde"); map.put(key1, 1); map.put(key2, 2); System.out.println(map.size()); System.out.println(map.get(key1)); System.out.println(map.get(key2)); } }

Результат выполнения кода:

2 1 2

Несмотря на то, что строки key1 и key2 содержат одинаковый текст, они являются разными объектами, поэтому в карте хранятся оба ключа.

Пример

Давайте сравним поведение IdentityHashMap и обычного HashMap при добавлении одинаковых по содержанию строк:

import java.util.IdentityHashMap; import java.util.HashMap; public class Main { public static void main(String[] args) { IdentityHashMap<String, Integer> identityMap = new IdentityHashMap<>(); HashMap<String, Integer> hashMap = new HashMap<>(); String key1 = new String("abcde"); String key2 = new String("abcde"); identityMap.put(key1, 1); identityMap.put(key2, 2); hashMap.put(key1, 1); hashMap.put(key2, 2); System.out.println("IdentityHashMap: " + identityMap.size()); System.out.println("HashMap: " + hashMap.size()); } }

Результат выполнения кода:

"IdentityHashMap: 2" "HashMap: 1"

В HashMap второй ключ перезаписал первый, так как строки равны по методу equals. В IdentityHashMap сохранились оба ключа, так как они являются разными объектами.

Пример

Давайте добавим в карту один и тот же объект в качестве ключа дважды и посмотрим на размер:

import java.util.IdentityHashMap; public class Main { public static void main(String[] args) { IdentityHashMap<String, Integer> map = new IdentityHashMap<>(); String key = new String("12345"); map.put(key, 1); map.put(key, 2); System.out.println(map.size()); System.out.println(map.get(key)); } }

Результат выполнения кода:

1 2

Так как ключ один и тот же объект, значение было перезаписано, а размер карты остался равным 1.

Смотрите также

  • класс Map,
    который является базовым интерфейсом для всех карт
  • класс LinkedHashMap,
    который сохраняет порядок добавления элементов
  • класс WeakHashMap,
    который хранит ключи по слабым ссылкам
  • класс EnumMap,
    который оптимизирован для ключей-перечислений
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить