Verificación de existencia de clave en HashMap
¿Siempre es necesario comprobar la existencia de claves en HashMap?
Tengo un HashMap con, digamos, 1000 entradas y estoy buscando mejorar la eficiencia. Si se accede al HashMap con mucha frecuencia, verificar 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á a la mitad los accesos al HashMap.
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 HashMap.
¿Alguna vez almacena un valor nulo? Si no, puedes simplemente hacer:
Foo value = map.get(key);
if (value != null) {
...
} else {
// No such key
}
De lo contrario, podrías simplemente verificar su existencia si obtienes un valor nulo:
Foo value = map.get(key);
if (value != null) {
...
} else {
// Key might be present...
if (map.containsKey(key)) {
// Okay, there's a key but the value is null
} else {
// Definitely no such key
}
}
No ganarás nada comprobando que la clave existe. Este es el código de HashMap
:
@Override
public boolean containsKey(Object key) {
Entry<K, V> m = getEntry(key);
return m != null;
}
@Override
public V get(Object key) {
Entry<K, V> m = getEntry(key);
if (m != null) {
return m.value;
}
return null;
}
Simplemente verifique si el valor de retorno de get()
es diferente de null
.
Este es el código fuente de HashMap.
Recursos :
Código fuente de HashMapMalo- Código fuente de HashMap Bueno
Una mejor manera es utilizar containsKey
el método de HashMap
. Mañana alguien agregará nulo al mapa. Debe diferenciar entre presencia de clave y clave con valor nulo.
¿Quieres decir que tienes un código como
if(map.containsKey(key)) doSomethingWith(map.get(key))
por todo el lugar ? Luego simplemente debes verificar si map.get(key)
devuelve nulo y listo. Por cierto, HashMap no genera excepciones por claves faltantes, sino que devuelve un valor nulo. El único caso en el que containsKey
es necesario 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.