The Jon Skeet answer indirizzi bene i due scenari (mappa con null
valore e non null
valore) in modo efficiente.
Circa le voci di numero e il problema di 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, il controllo per l'esistenza della chiave ad ogni accesso comporterà un grande overhead .
Una mappa con 1.000 voci non è una mappa enorme.
Così come una mappa con 5.000 o 10.000 voci.
Map
sono progettati per effettuare il recupero rapido con tali dimensioni.
Ora, si presume che hashCode()
delle chiavi della mappa fornisca una buona distribuzione.
Se è possibile utilizzare un Integer
come tipo di chiave, farlo.
Il suo metodo hashCode()
è molto efficiente dal momento che le collisioni non sono possibili per unici int
valori:
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 built-in come String
per esempio che viene spesso utilizzato in Map
, potresti avere delle collisioni ma da 1mila a qualche migliaio di oggetti nel numero Map
, dovresti averne pochissime in quanto il metodo String.hashCode()
fornisce una buona distribuzione.
Se si utilizza un tipo personalizzato, ignorare hashCode()
e equals()
correttamente e assicurarsi generale che hashCode()
fornisce una distribuzione equa.
È possibile fare riferimento all'articolo 9 di Java Effective
.
Ecco uno post che descrive la via.
"quindi si verifica un'eccezione": quale eccezione? Questo non sarà da java.util.HashMap ... – serg10