В Java В чем разница между IdentityHashMap и HashMap + Сравнение производительности

Опубликовано: 2021-10-19
разница между сравнением производительности идентичности и хэш-карты

Когда-то у меня был особый случай, когда мне нужно было сравнить ключ карты на основе equality operator (==) . Оператор равенства (==) сравнивает ссылки (адреса в памяти) двух ключей как два разных числа.

С другой стороны, HashMap является наиболее часто используемым компонентом Java Collection Framework, который сравнивает уникальность ключа с помощью метода equals() .

Кроме того, IdentityHashMap не использует хэш из object.hashCode() а использует System.identityHashCode(object) . Мы могли бы использовать IdentityHashMap для изменяемых объектов, чей хэш-код изменяется во время выполнения.

Если вы хотите узнать больше о equals() и == , которые применяются on String Object следуйте этому руководству: https://crunchify.com/how-to-override-equals-and-hashcode-method-in-java/.

Базовый тест, который демонстрирует приведенное выше поведение equals() и ==:

Результат:

Проведем тестирование производительности на обеих картах:

  1. Создайте класс Java: CrunchifyIdentityHashMapVsHashMapPerformance .java
  2. startCrunchifyTest()
    • Генерирует случайный размер карты в миллионах
    • Создание экземпляра и инициализация crunchifyString[] String Array с сгенерированным выше случайным числом с текстом: This is Crunchify's Test # number
  3. crunchifyCompareIdentityHashMapVsHashMap(String[] crunchifyString , Map<String, Integer> crunchifyMap , String name )
    • Передайте все необходимые параметры этому методу
    • crunchifyMap будет иметь значение IdentityHashMap / HashMap
    • Перебираем crunchifyString[] и помещаем значения в Map — эта операция занимает некоторое время
    • Перебрать crunchifyString[] и получить значения из Map — эта операция занимает некоторое время
    • Мы узнаем время выполнения обеих вышеуказанных операций, чтобы мы могли сравнить, какой из них лучше для вышеуказанных операций? IdentityHashMap ИЛИ HashMap
    • Распечатать приведенный выше результат
  4. Выполните вышеуказанные задания 2 и 3 всего 8 раз.

Результат:

Наблюдение:

Как вы можете видеть здесь, для больших карт IdentityHashMap работает намного лучше. Почему? IdentityHashMap doesn't use equals() and hashcode() methods , которые считаются очень дорогостоящими.

Просто к вашему сведению:

Вышеупомянутые операции, которые мы выполняем для помещения и получения значений из карты и в нее, очень интенсивно используют ЦП.

Тест IdentityHashMap vs HashMap — загрузка ЦП