¿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
get
está 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
containsKey
método deHashMap
. Mañana alguien agregará nulo al Mapa. Debe diferenciar entre la presencia de clave y la clave tiene un valor nulo.fuente
null
total.¿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 dondecontainsKey
se 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 deHashMap
s 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 laHashMap
clase.En el siguiente ejemplo,
map
almacena una lista de transacciones (enteros) que se aplican a la clave (el nombre de la cuenta bancaria). Para agregar 2 transacciones de100
y200
parachecking_account
usted puede escribir:De esta manera, no tiene que verificar si la clave
checking_account
existe 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
null
valor y nonull
valor) 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.
Map
está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
Integer
tipo de clave, hágalo.Su
hashCode()
método es muy eficiente ya que las colisiones no son posibles paraint
valores únicos :Si para la clave, tiene que usar otro tipo incorporado como,
String
por 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 Effective
refiere.Aquí hay una publicación que detalla el camino.
fuente