La risposta di Jon Skeet affronta bene i due scenari (mappa con null
valore e non null
valore) in modo efficiente.
Per quanto riguarda le voci numeriche e il problema dell'efficienza, vorrei aggiungere qualcosa.
Ho una HashMap con diciamo 1.000 voci e sto cercando di migliorare l'efficienza. Se si accede a HashMap molto frequentemente, la verifica dell'esistenza della chiave ad ogni accesso comporterà un notevole sovraccarico.
Una mappa con 1.000 voci non è una mappa enorme.
Oltre a una mappa con 5.000 o 10.000 voci.
Map
sono progettati per un rapido recupero con tali dimensioni.
Ora, si presume che hashCode()
delle chiavi della mappa fornisca una buona distribuzione.
Se puoi usare un Integer
tipo di chiave, fallo.
Il suo hashCode()
metodo è molto efficiente poiché le collisioni non sono possibili per int
valori univoci :
public final class Integer extends Number implements Comparable<Integer> {
...
@Override
public int hashCode() {
return Integer.hashCode(value);
}
public static int hashCode(int value) {
return value;
}
...
}
Se per la chiave, è necessario utilizzare un altro tipo incorporato come String
ad esempio in cui viene spesso utilizzato Map
, è possibile che si verifichino delle collisioni, ma da 1 000 a alcune migliaia di oggetti nel Map
, si dovrebbe avere pochissimi come String.hashCode()
metodo fornisce una buona distribuzione.
Se si utilizza un tipo personalizzato, eseguire l'override hashCode()
e equals()
correttamente e assicurarsi nel complesso che hashCode()
fornisca una distribuzione equa.
È possibile fare riferimento all'articolo 9 di Java Effective
esso si riferisce.
Ecco un post che descrive in modo dettagliato.