In Java qual è la differenza tra IdentityHashMap e HashMap + confronto delle prestazioni

Pubblicato: 2021-10-19
differenza-tra-identityhashmap-e-confronto-prestazioni-hashmap

Qualche tempo fa ho un caso speciale in cui devo confrontare Map's Key in base equality operator (==) . L'operatore di uguaglianza (==) confronta i riferimenti (indirizzi in memoria) delle due chiavi come due numeri diversi.

D'altra parte, HashMap è il componente Java Collection Framework più utilizzato che confronta l'unicità della chiave con l'aiuto del metodo equals() .

Inoltre, IdentityHashMap non usa l'hash da object.hashCode() ma usa System.identityHashCode(object) . Potremmo usare IdentityHashMap per oggetti mutabili per i quali il codice hash cambia durante il runtime.

Se vuoi saperne di più su equals() e == che si applica on String Object , segui questo tutorial: https://crunchify.com/how-to-override-equals-and-hashcode-method-in-java/.

Test di base che dimostra sopra equals() e == comportamento:

Risultato:

Eseguiamo i test delle prestazioni su entrambe le mappe:

  1. Crea classe Java: CrunchifyIdentityHashMapVsHashMapPerformance .java
  2. startCrunchifyTest()
    • Genera dimensioni della mappa casuali in milioni
    • Istanzia e inizializza crunchifyString[] String Array con il numero casuale generato sopra con testo: This is Crunchify's Test # number
  3. crunchifyCompareIdentityHashMapVsHashMap(String[] crunchifyString , Map<String, Integer> crunchifyMap , String name )
    • Passa tutti i parametri richiesti a questo metodo
    • crunchifyMap avrà valore IdentityHashMap / HashMap
    • Iterare attraverso crunchifyString[] e inserire i valori in Map: questa operazione richiede del tempo
    • Iterare attraverso crunchifyString[] e ottenere valori da Map: questa operazione richiede del tempo
    • Scopriremo il tempo di esecuzione per entrambe le operazioni precedenti in modo da poter confrontare quale è migliore per le operazioni precedenti? IdentityHashMap O HashMap
    • Stampa sopra il risultato
  4. Esegui le attività di cui sopra 2 e 3 in totale 8 volte.

Risultato:

Osservazione:

Come puoi vedere qui come risultato, per mappe di grandi dimensioni IdentityHashMap funziona molto meglio. Come mai? IdentityHashMap doesn't use equals() and hashcode() methods , che sono considerati molto costosi.

Solo per tua informazione:

Le operazioni di cui sopra che stiamo facendo per inserire e ottenere valori da e in Map sono molto impegnative per la CPU.

Test IdentityHashMap vs HashMap - Utilizzo della CPU