Java中IdentityHashMap和HashMap有什么区别+性能比较

已发表: 2021-10-19
身份哈希图和哈希图性能比较之间的差异

有时我有一个特殊情况,我必须根据equality operator (==)比较 Map 的 Key。 相等运算符 (==) 将两个 Key 的引用(内存中的地址)作为两个不同的数字进行比较。

另一方面,HashMap 是最常用的 Java 集合框架组件,它借助equals()方法比较 Key 的唯一性。

此外, IdentityHashMap不使用来自object.hashCode()的哈希,而是使用System.identityHashCode(object) 。 我们可以将 IdentityHashMap 用于其哈希码在运行时发生变化的可变对象。

如果您想了解更多关于适用on String Objectequals()==的信息,请遵循本教程:https://crunchify.com/how-to-override-equals-and-hashcode-method-in-java/。

演示上述 equals() 和 == 行为的基本测试:

结果:

让我们在两个地图上进行性能测试:

  1. 创建 Java 类: CrunchifyIdentityHashMapVsHashMapPerformance .java
  2. startCrunchifyTest()
    • 生成数百万的随机地图大小
    • 实例化和初始化crunchifyString[]字符串数组对象,上面生成带有文本的随机数: This is Crunchify's Test # number
  3. crunchifyCompareIdentityHashMapVsHashMap(String[] crunchifyString , Map<String, Integer> crunchifyMap , String name )
    • 将所有必需的参数传递给此方法
    • crunchifyMap将具有值 IdentityHashMap / HashMap
    • 遍历 crunchifyString[] 并将值放入 M​​ap - 此操作需要一些时间
    • 遍历 crunchifyString[] 并从 Map 中获取值——这个操作需要一些时间
    • 我们将找出上述两种操作的执行时间,以便我们比较哪一种更适合上述操作? 身份哈希映射或哈希映射
    • 打印上面的结果
  4. 执行上述任务 2 和 3 共 8 次。

结果:

观察:

正如您在结果中看到的那样,对于大型地图,IdentityHashMap 的性能要好得多。 为什么? IdentityHashMap doesn't use equals() and hashcode() methods ,这被认为是非常昂贵的。

仅供参考:

我们为从 Map 中输入和获取值所做的上述操作非常占用 CPU。

IdentityHashMap 与 HashMap 测试 - CPU 使用率