Введение

Привет, будущие разработчики Java! Сегодня мы отправляемся в захватывающее путешествие в мир класса IdentityHashMap в Java. Я знаю, что вы можете подумать: "Еще один класс-карта? Мы же только что узнали о HashMap?" Вы правы, но поверьте мне, IdentityHashMap имеет свой уникальный стиль, который делает его особенным. Давайте погружемся!

Java - The IdentityHashMap Class

Объявление класса

Сначала давайте посмотрим, как объявляется IdentityHashMap:

import java.util.IdentityHashMap;

IdentityHashMap<String, Integer> myMap = new IdentityHashMap<>();

Эта строка кода создает новый IdentityHashMap, который будет хранить ключи типа String и значения типа Integer. Но что отличает его от обычного HashMap? Вот тут начинается все интересное!

Конструкторы класса

IdentityHashMap имеет четыре конструктора. Рассмотрим их:

  1. Дефолтный конструктор:

    IdentityHashMap<String, Integer> map1 = new IdentityHashMap<>();

    Это создает пустой IdentityHashMap с 默认ным объемом 21.

  2. Конструктор с начальным объемом:

    IdentityHashMap<String, Integer> map2 = new IdentityHashMap<>(100);

    Это создает пустой IdentityHashMap с указанным начальным объемом.

  3. Конструктор с другой картой:

    Map<String, Integer> existingMap = new HashMap<>();
    IdentityHashMap<String, Integer> map3 = new IdentityHashMap<>(existingMap);

    Это создает IdentityHashMap с теми же маппингами, что и указанная карта.

  4. Конструктор с ожидаемым максимальным размером:

    IdentityHashMap<String, Integer> map4 = new IdentityHashMap<>(100, 0.75f);

    Это создает пустой IdentityHashMap с указанным ожидаемым максимальным размером и коэффициентом нагрузки.

Методы класса

Теперь рассмотрим некоторые из наиболее часто используемых методов в IdentityHashMap:

Метод Описание
put(K key, V value) Связывает указанное значение с указанным ключом
get(Object key) Возвращает значение, сопоставленное с указанным ключом
remove(Object key) Удаляет маппинг для этого ключа, если он существует
clear() Удаляет все маппинги из этой карты
size() Возвращает количество ключ-значение маппингов в этой карте
isEmpty() Возвращает true, если эта карта не содержит маппингов ключ-значение
containsKey(Object key) Возвращает true, если эта карта содержит маппинг для указанного ключа
containsValue(Object value) Возвращает true, если эта карта отображает один или несколько ключей на указанное значение

Давайте посмотрим на некоторые из этих методов в действии:

IdentityHashMap<String, Integer> ages = new IdentityHashMap<>();

// Добавление пар ключ-значение
ages.put("Alice", 25);
ages.put("Bob", 30);

// Получение значения
System.out.println("Возраст Alice: " + ages.get("Alice")); // Вывод: Возраст Alice: 25

// Проверка существования ключа
System.out.println("Существует ли Charlie? " + ages.containsKey("Charlie")); // Вывод: Существует ли Charlie? false

// Удаление пары ключ-значение
ages.remove("Bob");

// Проверка размера
System.out.println("Количество записей: " + ages.size()); // Вывод: Количество записей: 1

Наследованные методы

IdentityHashMap наследует методы от своих суперклассов и интерфейсов. Вот некоторые из них:

Наследовано от Методы
java.util.AbstractMap clone(), equals(), hashCode(), toString()
java.util.Map entrySet(), keySet(), values()
java.lang.Object finalize(), getClass(), notify(), notifyAll(), wait()

Пример добавления маппинга ключ-значение в IdentityHashMap

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

Посмотрим на это в действии:

IdentityHashMap<String, String> identityMap = new IdentityHashMap<>();

String key1 = new String("Привет");
String key2 = new String("Привет");

identityMap.put(key1, "Мир1");
identityMap.put(key2, "Мир2");

System.out.println("Размер IdentityHashMap: " + identityMap.size());
System.out.println("Значение для key1: " + identityMap.get(key1));
System.out.println("Значение для key2: " + identityMap.get(key2));

Вывод:

Размер IdentityHashMap: 2
Значение для key1: Мир1
Значение для key2: Мир2

Сюрприз? Хотя key1 и key2 имеют одинаковое содержимое ("Привет"), IdentityHashMap рассматривает их как разные ключи, потому что они являются разными объектами String в памяти.

Это поведение может быть чрезвычайно полезным в определенных сценариях. Например, представьте себе, что вы пишете программу для отслеживания разных версий документа. Каждая версия может иметь одинаковый заголовок, но вы хотите рассматривать их как отдельные сущности. IdentityHashMap был бы идеальным выбором для этого!

В заключение, IdentityHashMap — это как странствующий дядюшка в семье Map. Он выглядит похоже на других, но у него свой уникальный способ действий. Понимание того, когда его использовать, может сделать вас более универсальным программистом Java.

Помните, в мире программирования не существует универсального решения. Каждый инструмент имеет свое место, и знание того, когда использовать IdentityHashMap, — это еще одна стрела в вашем колчане знаний Java. Удачи в практике, оставайтесь любознательными и счастливого кодирования!

Credits: Image by storyset