Назад к вопросам
Middle+
115
questionbank

В чем разница между HashMap и IdentityHashMap?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Основное отличие в том, как они сравнивают ключи.

  • HashMap использует метод equals() и хэш-код ключа для определения равенства, что соответствует стандартной семантике равенства объектов.
  • IdentityHashMap сравнивает ключи строго по ссылке (используя ==), игнорируя метод equals(). Это означает, что два различных объекта, даже если они "равны" согласно их методу equals(), будут считаться разными ключами в IdentityHashMap, если они имеют разные адреса в памяти.

Пример:

// HashMap
Object key1 = new String(" ключ");
Object key2 = new String(" ключ");
Map<Object, String> hashMap = new HashMap<>();
hashMap.put(key1, "значение 1");
hashMap.put(key2, "значение 2"); // перезапишет значение для " ключ"

// IdentityHashMap
Map<Object, String> identityHashMap = new IdentityHashMap<>();
identityHashMap.put(key1, "значение 1");
identityHashMap.put(key2, "значение 2"); // добавит вторую запись, так как key1 != key2 по ссылке

Используется IdentityHashMap реже, например:

  • При сериализации/десериализации, когда важна идентичность объектов в рамках одного графа объектов.
  • В некоторых специфических алгоритмах, где требуется различать объекты по их идентичности, а не по их логическому эквиваленту.
  • Для обнаружения циклических ссылок.