Em Java, qual é a diferença entre IdentityHashMap e HashMap + Comparação de desempenho

Publicados: 2021-10-19
diferença-entre-identidadehashmap-e-hashmap-comparação de desempenho

Algum tempo atrás eu tenho um caso especial em que eu tenho que comparar a chave do mapa com base no equality operator (==) . O operador de igualdade (==) compara as referências (endereços na memória) das duas Chaves como dois números diferentes.

Por outro lado, HashMap é o componente Java Collection Framework mais usado que compara a exclusividade da chave com a ajuda do método equals() .

Além disso, IdentityHashMap não usa hash de object.hashCode() mas usa System.identityHashCode(object) . Poderíamos usar IdentityHashMap para objetos mutáveis ​​cujo código de hash muda durante o tempo de execução.

Se você quiser saber mais sobre equals() e == que se aplica on String Object , siga este tutorial: https://crunchify.com/how-to-override-equals-and-hashcode-method-in-java/.

Teste básico que demonstra o comportamento equals() e == acima:

Resultado:

Vamos fazer o teste de desempenho nos dois mapas:

  1. Criar classe Java: CrunchifyIdentityHashMapVsHashMapPerformance .java
  2. startCrunchifyTest()
    • Gera o tamanho do mapa aleatório em milhões
    • Instancie e inicialize crunchifyString[] String Array objeto com o número aleatório gerado acima com texto: This is Crunchify's Test # number
  3. crunchifyCompareIdentityHashMapVsHashMap(String[] crunchifyString , Map<String, Integer> crunchifyMap , String name )
    • Passe todos os parâmetros necessários para este método
    • crunchifyMap terá valor IdentityHashMap / HashMap
    • Iterar por meio de crunchifyString[] e colocar valores em Map — esta operação leva algum tempo
    • Iterar através de crunchifyString[] e obter valores de Map — esta operação leva algum tempo
    • Vamos descobrir o tempo de execução para ambas as operações acima para que possamos comparar qual delas é melhor para as operações acima? IdentityHashMap OU HashMap
    • Imprimir resultado acima
  4. Execute as tarefas acima 2 e 3 no total 8 vezes.

Resultado:

Observação:

Como você pode ver aqui no resultado, para mapas grandes, o IdentityHashMap tem um desempenho muito melhor. Por quê? IdentityHashMap doesn't use equals() and hashcode() methods , que são considerados muito caros.

Apenas FYI:

As operações acima que estamos fazendo para colocar e obter valores de e para Map são muito intensivas em CPU.

Teste IdentityHashMap vs HashMap - uso da CPU