O java.util.HashMap como o próprio nome diz utiliza-se do hash code do objeto “chave” para mapear as entradas do mapa. Funciona basicamente assim:
HashMap map = new HashMap();
map.put("matricula.12345", "Fabricio");
A essência do funcionamento do método put() é :
public void put(Object key, Object value){
int hash = geraHashCode(key);
int posicao = geraPosicaoNaTabela(hash);
adicionaNaTabelaDeEntradas(posicao, value);
}
Quando porém estamos trabalhando com um mapa onde as chaves já são inteiros muitas operações do mapa podem ser simplificadas, solução: IntHashMap.
Algumas coporações como a Oracle, Apache, etc… possuem em suas “foundation classes” alguma implementações que trababalhem desta forma para obterem melhor performance. Afim de comparar o desempenho com HashMap executei dois teste simples
- Povoando o mapa com 1000000 chaves sequenciais (Puts)
- Recuperando todos os objetos do mapa (Gets), utilizou-se string como objeto para evitar autobox/unbox.
O resultado foram ganhos em média de 70% para os puts, e 30% para os gets efetuados no mapa. Veja o resultado de uma excução:
Main.testSunMap()…
Main.testIntMap()…
‘Puts’ execution time (milliseconds):
sunMap: 3328 intMap: 922, Percentage of gain: 73%
‘Gets’ execution time (milliseconds):
sunMap: 234 intMap: 140, Percentage of gain: 41%
Conclusão
Se suas chaves são inteiros use IntHashMap. Os resultados foram obtidos usando java 5, o mesmo exemplo foi executado com 1.4 e obteve em média os mesmos valores, no entanto se em sua aplicação você não tomar os devidos cuidados no uso do autoboxing/unboxing de valores primitivos para objetos, a diferença de ganho vai ser ainda em muito melhor para o IntHashMap devido a perda de performance executando o boxing.
Read More