HashMap permite uma chave nula e qualquer número de valores nulos. Qual é a utilidade disso?
ConcurrentHashMapnão suporta chaves nulas, mas HashMapsim.
HashMap permite uma chave nula e qualquer número de valores nulos. Qual é a utilidade disso?
ConcurrentHashMapnão suporta chaves nulas, mas HashMapsim.
Respostas:
Não tenho certeza do que você está perguntando, mas se você está procurando um exemplo de quando alguém gostaria de usar uma chave nula, eu as uso frequentemente em mapas para representar o caso padrão (ou seja, o valor que deve ser usado se uma determinada chave não estiver presente):
Map<A, B> foo;
A search;
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
HashMaplida com chaves nulas especialmente (uma vez que não pode chamar .hashCode()um objeto nulo), mas os valores nulos não são nada de especial, eles são armazenados no mapa como qualquer outra coisa
HashMap( putForNullKey) que trata disso; ele o armazena na tabela 0
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);, acho que podemos simplesmente chamar o método get na chave de pesquisa que terá o mesmo resultado. B val = foo.get(search);você poderia me corrigir se eu estou entendendo algo errado?
valcomo nullse a chave não existir; o meu define para qualquer nullmapa no mapa. Esse era o ponto, eu armazenei um valor não nulo padrão na nullchave do mapa e o utilizo se a chave real não existir
Um exemplo de uso de null valores é ao usar um HashMapcomo cache para resultados de uma operação cara (como uma chamada para um serviço da web externo) que pode retornar null.
Colocar um nullvalor no mapa permite distinguir entre o caso em que a operação não foi realizada para uma determinada chave ( cache.containsKey(someKey)retorna false) e onde a operação foi realizada, mas retornou um nullvalor ( cache.containsKey(someKey)retorna true, cache.get(someKey)retorna null).
Sem nullvalores, você teria que colocar algum valor especial no cache para indicar uma nullresposta ou simplesmente não armazenar em cache essa resposta e executar a operação todas as vezes.
As respostas até agora consideram apenas o valor de ter uma nullchave, mas a pergunta também pergunta sobre any number of null values.
O benefício de armazenar o valor em nullrelação a uma chave em um HashMap é o mesmo que em bancos de dados, etc - você pode registrar uma distinção entre ter um valor que está vazio (por exemplo, string "") e não ter nenhum valor (nulo) .
Aqui está meu único exemplo um tanto artificial de um caso em que a nullchave pode 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 Exceptionperto. Além disso, tentar parar um cronômetro inexistente ou já parado é algo do qual o chamador geralmente pode se recuperar.