Verificación de existencia de clave en HashMap

Resuelto athena asked hace 14 años • 12 respuestas

¿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.

athena avatar Sep 02 '10 18:09 athena
Aceptado

¿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
    }
}
Jon Skeet avatar Sep 02 '2010 11:09 Jon Skeet

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 HashMap Malo
  • Código fuente de HashMap Bueno
Colin Hebert avatar Sep 02 '2010 11:09 Colin Hebert

Una mejor manera es utilizar containsKeyel método de HashMap. Mañana alguien agregará nulo al mapa. Debe diferenciar entre presencia de clave y clave con valor nulo.

Dead Programmer avatar Sep 02 '2010 12:09 Dead Programmer

¿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 containsKeyes 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.

jkff avatar Sep 02 '2010 11:09 jkff