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 使用率