En Java Quelle est la différence entre IdentityHashMap et HashMap + Comparaison des performances

Publié: 2021-10-19
différence-entre-identityhashmap-et-hashmap-performance-comparaison

Il y a quelque temps, j'ai un cas particulier dans lequel je dois comparer Map's Key en fonction de equality operator (==) . L'opérateur d'égalité (==) compare les références (adresses en mémoire) des deux clés comme deux nombres différents.

D'autre part, HashMap est le composant Java Collection Framework le plus utilisé qui compare l'unicité de la clé à l'aide de la méthode equals() .

De plus, IdentityHashMap n'utilise pas le hachage de object.hashCode() mais utilise System.identityHashCode(object) . Nous pourrions utiliser IdentityHashMap pour les objets mutables dont le code de hachage change pendant l'exécution.

Si vous voulez en savoir plus sur equals() et == qui s'appliquent on String Object , suivez ce tutoriel : https://crunchify.com/how-to-override-equals-and-hashcode-method-in-java/.

Test de base qui démontre le comportement ci-dessus equals() et == :

Résultat:

Faisons des tests de performances sur les deux cartes :

  1. Créer une classe Java : CrunchifyIdentityHashMapVsHashMapPerformance .java
  2. startCrunchifyTest()
    • Génère une taille de carte aléatoire en millions
    • Instanciez et initialisez crunchifyString[] String Array avec le numéro aléatoire généré ci-dessus avec du texte : This is Crunchify's Test # number
  3. crunchifyCompareIdentityHashMapVsHashMap(String[] crunchifyString , Map<String, Integer> crunchifyMap , String name )
    • Passez tous les paramètres requis à cette méthode
    • crunchifyMap aura pour valeur IdentityHashMap / HashMap
    • Itérer à travers crunchifyString[] et mettre des valeurs dans Map - cette opération prend un certain temps
    • Itérer à travers crunchifyString[] et obtenir les valeurs de Map — cette opération prend un certain temps
    • Nous découvrirons le temps d'exécution pour les deux opérations ci-dessus afin de pouvoir comparer laquelle est la meilleure pour les opérations ci-dessus ? IdentityHashMap OR HashMap
    • Imprimer le résultat ci-dessus
  4. Effectuez les tâches 2 et 3 ci-dessus 8 fois au total.

Résultat:

Observation:

Comme vous pouvez le voir ici dans le résultat, pour les grandes cartes, IdentityHashMap fonctionne beaucoup mieux. Pourquoi? IdentityHashMap doesn't use equals() and hashcode() methods , considérées comme très coûteuses.

Juste FYI:

Les opérations ci-dessus que nous effectuons pour mettre et obtenir des valeurs depuis et vers Map sont très gourmandes en CPU.

Test IdentityHashMap vs HashMap - Utilisation du processeur