En Java ¿Cuál es la diferencia entre IdentityHashMap y HashMap + Comparación de rendimiento?

Publicado: 2021-10-19
diferencia-entre-identityhashmap-y-hashmap-rendimiento-comparación

Hace algún tiempo, tengo un caso especial en el que tengo que comparar la clave del mapa en función del equality operator (==) . El operador de igualdad (==) compara las referencias (direcciones en la memoria) de las dos Claves como dos números diferentes.

Por otro lado, HashMap es el componente Java Collection Framework más utilizado que compara la singularidad de la clave con la ayuda del método equals() .

Además, IdentityHashMap no usa hash de object.hashCode() sino que usa System.identityHashCode(object) . Podríamos usar IdentityHashMap para objetos mutables cuyo código hash cambia durante el tiempo de ejecución.

Si desea obtener más información sobre equals() y == que se aplica on String Object , siga este tutorial: https://crunchify.com/how-to-override-equals-and-hashcode-method-in-java/.

Prueba básica que demuestra el comportamiento anterior de equals() y ==:

Resultado:

Hagamos pruebas de rendimiento en ambos mapas:

  1. Crear clase Java: CrunchifyIdentityHashMapVsHashMapPerformance .java
  2. startCrunchifyTest()
    • Genera tamaño de mapa aleatorio en millones
    • Crear una instancia e inicializar el objeto de matriz de cadenas crunchifyString[] con el número aleatorio generado anteriormente con texto: This is Crunchify's Test # number
  3. crunchifyCompareIdentityHashMapVsHashMap(String[] crunchifyString , Map<String, Integer> crunchifyMap , String name )
    • Pase todos los parámetros requeridos a este método
    • crunchifyMap tendrá valor IdentityHashMap / HashMap
    • Iterar a través de crunchifyString[] y poner valores en Map: esta operación lleva algún tiempo
    • Iterar a través de crunchifyString[] y obtener valores de Map: esta operación lleva algún tiempo
    • Descubriremos el tiempo de ejecución de las dos operaciones anteriores para poder comparar cuál es mejor para las operaciones anteriores. IdentityHashMap O HashMap
    • Imprime el resultado anterior
  4. Realice las tareas anteriores 2 y 3 en total 8 veces.

Resultado:

Observación:

Como puede ver aquí en el resultado, para mapas grandes, IdentityHashMap funciona mucho mejor. ¿Por qué? IdentityHashMap doesn't use equals() and hashcode() methods , que se consideran muy costosos.

Solo para tu información:

Las operaciones anteriores que estamos haciendo para poner y obtener valores desde y hacia Map requieren mucha CPU.

Prueba IdentityHashMap vs HashMap: uso de CPU