¿Es siempre necesario verificar la existencia de claves en HashMap?
Tengo un HashMap con unas 1000 entradas y estoy buscando mejorar la eficiencia. Si se accede a HashMap con mucha frecuencia, la comprobación de la existencia de la clave en cada acceso generará una gran sobrecarga. En cambio, si la clave no está presente y, por lo tanto, se produce una excepción, puedo detectar la excepción. (cuando sé que esto sucederá raramente). Esto reducirá los accesos a HashMap a la mitad.
Puede que esta no sea una buena práctica de programación, pero me ayudará a reducir la cantidad de accesos. ¿O me estoy perdiendo algo aquí?
[ Actualización ] No tengo valores nulos en el HashMap.

Respuestas:
¿Alguna vez almacenó un valor nulo? Si no, simplemente puedes hacer:
De lo contrario, podría verificar la existencia si obtiene un valor nulo devuelto:
fuente
getestá bien y evita hacer dos búsquedas cuando también necesita el valor.if(value!=null || map.containsKey(key))para la segunda parte. Al menos si quieres hacer lo mismo de cualquier manera, sin código repetido. Funcionará debido a cortocircuitos .No ganará nada comprobando que la clave existe. Este es el código de
HashMap:Simplemente verifique si el valor de retorno
get()es diferente denull.Este es el código fuente de HashMap.
Recursos:
Código fuente de HashMapMalofuente
Mejor manera es utilizar el
containsKeymétodo deHashMap. Mañana alguien agregará nulo al Mapa. Debe diferenciar entre la presencia de clave y la clave tiene un valor nulo.fuente
nulltotal.¿Quieres decir que tienes un código como
por todo el lugar ? Entonces simplemente debe verificar si
map.get(key)devuelve nulo y eso es todo. Por cierto, HashMap no arroja excepciones para las claves faltantes, sino que devuelve nulo. El único caso dondecontainsKeyse necesita es cuando se almacenan valores nulos, para distinguir entre un valor nulo y un valor faltante, pero esto generalmente se considera una mala práctica.fuente
Solo úsalo
containsKey()para mayor claridad. Es rápido y mantiene el código limpio y legible. El punto deHashMaps es que la búsqueda de claves es rápido, basta con que elhashCode()yequals()se aplica correctamente.fuente
fuente
También puede usar el
computeIfAbsent()método en laHashMapclase.En el siguiente ejemplo,
mapalmacena una lista de transacciones (enteros) que se aplican a la clave (el nombre de la cuenta bancaria). Para agregar 2 transacciones de100y200parachecking_accountusted puede escribir:De esta manera, no tiene que verificar si la clave
checking_accountexiste o no.computeIfAbsent().Muy elegante! 👍
fuente
Usualmente uso el idioma
Esto significa que solo toca el mapa dos veces si falta la clave
fuente
fuente
La respuesta de Jon Skeet aborda bien los dos escenarios (mapa con
nullvalor y nonullvalor) de manera eficiente.Sobre las entradas de números y la preocupación de eficiencia, me gustaría agregar algo.
Un mapa con 1.000 entradas no es un mapa enorme.
Además de un mapa con 5.000 o 10.000 entradas.
Mapestán diseñados para hacer una recuperación rápida con tales dimensiones.Ahora, se supone que
hashCode()las teclas del mapa proporcionan una buena distribución.Si puede usar un
Integertipo de clave, hágalo.Su
hashCode()método es muy eficiente ya que las colisiones no son posibles paraintvalores únicos :Si para la clave, tiene que usar otro tipo incorporado como,
Stringpor ejemplo, que se usa a menudoMap, puede tener algunas colisiones, pero de 1 mil a algunos miles de objetos en elMap, debe tener muy pocos comoString.hashCode()método Proporciona una buena distribución.Si usa un tipo personalizado, anule
hashCode()y corrijaequals()correctamente y, en general, asegúrese de quehashCode()proporciona una distribución justa.Puede consultar el artículo 9 de lo
Java Effectiverefiere.Aquí hay una publicación que detalla el camino.
fuente