HashMap permite una clave nula y cualquier número de valores nulos. ¿Cuál es el uso de ello?
ConcurrentHashMapno admite claves nulas, mientras que HashMapsí.
HashMap permite una clave nula y cualquier número de valores nulos. ¿Cuál es el uso de ello?
ConcurrentHashMapno admite claves nulas, mientras que HashMapsí.
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);
HashMapmaneja 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?
valen nullsi la clave no existe; el mío lo establece en cualquier nullmapa del mapa. Ese era el punto, almaceno un valor predeterminado no nulo en la nullclave en el mapa y lo uso si la clave real no existe
Un ejemplo de uso de null valores es cuando se usa HashMapcomo caché para los resultados de una operación costosa (como una llamada a un servicio web externo) que puede devolvernull .
Poner un nullvalor 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 nullvalor ( cache.containsKey(someKey)retornos true, cache.get(someKey)retornos null).
Sin nullvalores, tendría que poner algún valor especial en el caché para indicar una nullrespuesta, 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 nullclave, pero la pregunta también indaga sobre any number of null values.
El beneficio de almacenar el valor nullcontra 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 nullclave 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 Exceptiontenerla 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.