In Java Was ist ein Unterschied zwischen IdentityHashMap und HashMap + Leistungsvergleich

Veröffentlicht: 2021-10-19
unterschied-zwischen-identitätshashmap-und-hashmap-leistungsvergleich

Vor einiger Zeit habe ich einen Sonderfall, in dem ich den Schlüssel von Map basierend auf dem equality operator (==) vergleichen muss. Der Gleichheitsoperator (==) vergleicht die Referenzen (Adressen im Speicher) der beiden Schlüssel als zwei verschiedene Zahlen.

Andererseits ist HashMap die am häufigsten verwendete Java Collection Framework-Komponente, die die Eindeutigkeit des Schlüssels mit Hilfe der Methode equals() vergleicht.

Außerdem verwendet IdentityHashMap keinen Hash von object.hashCode() , sondern System.identityHashCode(object) . Wir könnten IdentityHashMap für veränderliche Objekte verwenden, deren Hashcode sich während der Laufzeit ändert.

Wenn Sie mehr über equals() und == erfahren möchten, die für on String Object gelten, folgen Sie diesem Tutorial: https://crunchify.com/how-to-override-equals-and-hashcode-method-in-java/.

Grundlegender Test, der das obige Verhalten von equal() und == demonstriert:

Ergebnis:

Lassen Sie uns Leistungstests auf beiden Karten durchführen:

  1. Java-Klasse erstellen: CrunchifyIdentityHashMapVsHashMapPerformance .java
  2. startCrunchifyTest()
    • Erzeugt eine zufällige Kartengröße in Millionen
    • Instantiiere und initialisiere crunchifyString[] String Array-Objekt mit der oben generierten Zufallszahl mit Text: This is Crunchify's Test # number
  3. crunchifyCompareIdentityHashMapVsHashMap(String[] crunchifyString , Map<String, Integer> crunchifyMap , String name )
    • Übergeben Sie alle erforderlichen Parameter an diese Methode
    • crunchifyMap wird den Wert IdentityHashMap / HashMap haben
    • Iteriere durch crunchifyString[] und setze Werte auf Map – diese Operation dauert einige Zeit
    • Durchlaufen Sie crunchifyString[] und erhalten Sie Werte von Map – diese Operation dauert einige Zeit
    • Wir werden die Ausführungszeit für beide oben genannten Operationen herausfinden, damit wir vergleichen können, welche für die oben genannten Operationen besser ist. IdentityHashMap ODER HashMap
    • Drucken Sie das obige Ergebnis aus
  4. Führen Sie die obigen Aufgaben 2 und 3 insgesamt 8 Mal durch.

Ergebnis:

Überwachung:

Wie Sie hier im Ergebnis sehen können, schneidet IdentityHashMap für große Karten viel besser ab. Warum? IdentityHashMap doesn't use equals() and hashcode() methods , die als sehr kostspielig gelten.

Nur zur Info:

Die oben genannten Operationen, die wir zum Einfügen und Abrufen von Werten von und in Map ausführen, sind sehr CPU-intensiv.

IdentityHashMap vs. HashMap-Test – CPU-Auslastung