Класс 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,
который оптимизирован для ключей-перечислений