La respuesta de Jon Skeet aborda bien los dos escenarios (mapa con null
valor y no null
valor) de manera eficiente.
Sobre las entradas de números y la preocupación de eficiencia, me gustaría agregar algo.
Tengo un HashMap con, digamos, 1.000 entradas y estoy buscando mejorar la eficiencia. Si se accede a HashMap con mucha frecuencia, la comprobación de la existencia de la clave en cada acceso generará 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 hacer una recuperación rápida con tales dimensiones.
Ahora, se supone que hashCode()
las teclas del mapa proporcionan una buena distribución.
Si puede usar un Integer
tipo de clave, hágalo.
Su hashCode()
método 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 para la clave, tiene que usar otro tipo incorporado como, String
por ejemplo, que se usa a menudo Map
, puede tener algunas colisiones, pero de 1 mil a algunos miles de objetos en el Map
, debe tener muy pocos como String.hashCode()
método Proporciona una buena distribución.
Si usa un tipo personalizado, anule hashCode()
y corrija equals()
correctamente y, en general, asegúrese de que hashCode()
proporciona una distribución justa.
Puede consultar el artículo 9 de lo Java Effective
refiere.
Aquí hay una publicación que detalla el camino.