HashMap permite una clave nula y cualquier número de valores nulos. ¿Cuál es el uso de ello?
ConcurrentHashMap
no admite claves nulas, mientras que HashMap
sí.
HashMap permite una clave nula y cualquier número de valores nulos. ¿Cuál es el uso de ello?
ConcurrentHashMap
no admite claves nulas, mientras que HashMap
sí.
Respuestas:
No estoy seguro de lo que está preguntando, pero si está buscando un ejemplo de cuándo uno querría usar una clave nula, los uso a menudo en mapas para representar el caso predeterminado (es decir, el valor que debe usarse si una clave determinada no está presente):
Map<A, B> foo;
A search;
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
HashMap
maneja claves nulas especialmente (ya que no puede llamar .hashCode()
a un objeto nulo), pero los valores nulos no son nada especial, se almacenan en el mapa como cualquier otra cosa
HashMap
( putForNullKey
) que lo maneja; lo almacena en la tabla 0
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
Creo que simplemente podemos llamar al método get en la clave de búsqueda que tendrá el mismo resultado. B val = foo.get(search);
¿Podría corregirme si me equivoco?
val
en null
si la clave no existe; el mío lo establece en cualquier null
mapa del mapa. Ese era el punto, almaceno un valor predeterminado no nulo en la null
clave en el mapa y lo uso si la clave real no existe
Un ejemplo de uso de null
valores es cuando se usa HashMap
como caché para los resultados de una operación costosa (como una llamada a un servicio web externo) que puede devolvernull
.
Poner un null
valor en el mapa le permite distinguir entre el caso en el que la operación no se ha realizado para una clave determinada ( cache.containsKey(someKey)
retornos false
) y donde la operación se realizó pero devolvió un null
valor ( cache.containsKey(someKey)
retornos true
, cache.get(someKey)
retornos null
).
Sin null
valores, tendría que poner algún valor especial en el caché para indicar una null
respuesta, o simplemente no almacenar en caché esa respuesta y realizar la operación cada vez.
Las respuestas hasta ahora solo consideran el valor de tener una null
clave, pero la pregunta también indaga sobre any number of null values
.
El beneficio de almacenar el valor null
contra una clave en un HashMap es el mismo que en las bases de datos, etc., puede registrar una distinción entre tener un valor que está vacío (por ejemplo, cadena "") y no tener ningún valor (nulo) .
Aquí está mi único ejemplo algo artificial de un caso en el que la null
clave puede ser útil:
public class Timer {
private static final Logger LOG = Logger.getLogger(Timer.class);
private static final Map<String, Long> START_TIMES = new HashMap<String, Long>();
public static synchronized void start() {
long now = System.currentTimeMillis();
if (START_TIMES.containsKey(null)) {
LOG.warn("Anonymous timer was started twice without being stopped; previous timer has run for " + (now - START_TIMES.get(null).longValue()) +"ms");
}
START_TIMES.put(null, now);
}
public static synchronized long stop() {
if (! START_TIMES.containsKey(null)) {
return 0;
}
return printTimer("Anonymous", START_TIMES.remove(null), System.currentTimeMillis());
}
public static synchronized void start(String name) {
long now = System.currentTimeMillis();
if (START_TIMES.containsKey(name)) {
LOG.warn(name + " timer was started twice without being stopped; previous timer has run for " + (now - START_TIMES.get(name).longValue()) +"ms");
}
START_TIMES.put(name, now);
}
public static synchronized long stop(String name) {
if (! START_TIMES.containsKey(name)) {
return 0;
}
return printTimer(name, START_TIMES.remove(name), System.currentTimeMillis());
}
private static long printTimer(String name, long start, long end) {
LOG.info(name + " timer ran for " + (end - start) + "ms");
return end - start;
}
}
throw Exception
tenerla cerca. Además, no es como si intentar detener un temporizador inexistente o ya detenido fuera algo de lo que la persona que llama generalmente puede recuperarse.