În Java Care este diferența dintre IdentityHashMap și HashMap + Comparație de performanță

Publicat: 2021-10-19
diferența-între-identityhashmap-și-hashmap-comparație-performanță

Cu ceva timp în urmă, am un caz special în care trebuie să compar cheia Hărții pe baza equality operator (==) . Operatorul de egalitate (==) compară referințele (adresele din memorie) celor două chei ca două numere diferite.

Pe de altă parte, HashMap este cea mai utilizată componentă Java Collection Framework, care compară unicitatea cheii cu ajutorul metodei equals() .

De asemenea, IdentityHashMap nu folosește hash de la object.hashCode() ci folosește System.identityHashCode(object) . Am putea folosi IdentityHashMap pentru obiecte mutabile pentru al căror cod hash se modifică în timpul rulării.

Dacă doriți să aflați mai multe despre equals() și == care se aplică on String Object , urmați acest tutorial: https://crunchify.com/how-to-override-equals-and-hashcode-method-in-java/.

Test de bază care demonstrează mai sus equals() și == comportament:

Rezultat:

Să facem testarea performanței pe ambele hărți:

  1. Creați o clasă Java: CrunchifyIdentityHashMapVsHashMapPerformance .java
  2. startCrunchifyTest()
    • Generează dimensiunea aleatorie a hărții în milioane
    • Instanțiază și inițializează crunchifyString[] String Array obiect cu un număr aleatoriu generat mai sus cu text: This is Crunchify's Test # number
  3. crunchifyCompareIdentityHashMapVsHashMap(String[] crunchifyString , Map<String, Integer> crunchifyMap , String name )
    • Transmiteți toți parametrii necesari acestei metode
    • crunchifyMap va avea valoarea IdentityHashMap / HashMap
    • Iterați prin crunchifyString[] și puneți valori în Map - această operațiune durează ceva timp
    • Iterați prin crunchifyString[] și obțineți valori din Map - această operațiune durează ceva timp
    • Vom afla timpul de execuție pentru ambele operațiuni de mai sus, astfel încât să putem compara care este mai bună pentru operațiunile de mai sus? IdentityHashMap SAU HashMap
    • Imprimați rezultatul de mai sus
  4. Efectuați sarcinile de mai sus 2 și 3 în total de 8 ori.

Rezultat:

Observare:

După cum puteți vedea aici în rezultat, pentru hărți mari IdentityHashMap are performanțe mult mai bune. De ce? IdentityHashMap doesn't use equals() and hashcode() methods , care sunt considerate foarte costisitoare.

Doar FYI:

Operațiunile de mai sus pe care le facem pentru introducerea și obținerea de valori din și în Map consumă foarte mult CPU.

Test IdentityHashMap vs HashMap - utilizarea procesorului