The Jon Skeet answer direcciones así los dos escenarios (mapa con null
valor y no null
valor) de una manera eficiente.
Acerca de las entradas de números y la preocupación por la eficiencia, me gustaría agregar algo.
Tengo un HashMap con unas 1.000 entradas y estoy buscando mejorar la eficiencia. Si se accede al HashMap con mucha frecuencia, entonces comprobando la existencia de la clave en cada acceso dará lugar a una gran sobrecarga .
Un mapa con 1.000 entradas no es un mapa enorme.
Además de un mapa con 5.000 o 10.000 entradas.
Map
están diseñados para realizar una recuperación rápida con tales dimensiones.
Ahora, se supone que hashCode()
de las teclas del mapa proporciona una buena distribución.
Si puede usar un Integer
como tipo de llave, hágalo.
Su método hashCode()
es muy eficiente ya que las colisiones no son posibles para int
valores únicos:
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;
}
...
}
Si la llave, usted tiene que utilizar otro tipo incorporado como String
, por ejemplo, que se utiliza a menudo en Map
, es posible que tenga algunas colisiones, pero de 1 mil a algunos miles de objetos en el Map
, debe tener muy pocos, ya que el método String.hashCode()
proporciona una buena distribución.
Si utiliza un tipo personalizado, anular y hashCode()
equals()
correctamente y asegúrese de que hashCode()
general proporciona una distribución justa.
Puede consultar el artículo 9 de Java Effective
lo refiere.
Aquí hay un post que detalla el camino.
"por lo tanto y se produce una excepción" - ¿qué excepción? Esto no será de java.util.HashMap ... – serg10