2013-02-09 14 views
8

In Java, avendo un HashMap completamente compilato con i dati di tale forma:Verificare l'esistenza di una HashMap chiave

HashMap<Integer, int[]> map = new HashMap<Integer, int[]>(1000000, 1); 

ciò che è più veloce quando si controlla l'esistenza di una chiave casuale, dicono 100:

if (map.get(100) == null)) 

o

if (!map.containsKey(100)) 

?

La domanda è interessante dal punto di vista dell'ottimizzazione.

+0

Perché non testarlo? – rekire

+0

L'ho fatto, ma dà sempre diversi tempi di esecuzione che sono in un intervallo e più o meno lo stesso. Quindi non ho idea di cosa sia veramente più veloce. –

risposta

15

Il containsKey dovrebbe essere leggermente più lento perché si traduce in una chiamata di funzione in più (solo chiamate getEntry) (si potrebbe ottenere ottimizzato via, io non sono sicuro se Java lo farà). containsKey assomiglia:

public boolean containsKey(Object key) { 
    return getEntry(key) != null; 
} 

ma nota che containsKey potrebbe d'altra parte essere leggermente più veloce su altri Map implementazioni (ma probabilmente non quelle nelle API standard di Java).

Generalmente i miei implementazioni assomigliano: (evitando la necessità di containsKey)

int[] arr = map.get(100); 
if (arr == null) // doesn't exist 
    // do stuff 
else // exists 
    // do stuff with arr 

Il sotto sarebbe sicuramente essere più lento di quanto sopra: (se gli articoli che vuoi inserire esistono un ragionevole lasso di tempo)

if (!map.containsKey(100)) // doesn't exist 
    // do stuff 
else // exists 
{ 
    int[] arr = map.get(100); 
    // do stuff with arr 
} 

Edit: Grazie a zvzdhk per fornire la fonte di containsKey. Dovrei effettivamente aver controllato.

5

In realtà entrambi gli approcci sono uguali. Se si guarda in java.util.HashMap codice sorgente è possibile trovare prossimo containsKey realizzazione:

public boolean containsKey(Object key) { 
    return getEntry(key) != null; 
} 
+1

Bene, @downvoter, correggimi se sbaglio. – bsiamionau

2

I due differisce solo in return tipo, tranne che map.get(key) può restituire si null nel caso in cui se una chiave, tuttavia map.containsKey(key) lo restituisca boolean che potrebbe essere utilizzato per distinguere i due possibili casi di map.get(key) restituendo null.

1

Non c'è differenza tra questi due approcci. La principale differenza è solo ciò che farai dopo. Se hai bisogno del valore allora, ovviamente, avrai il valore.

Problemi correlati