HashMap permite uma chave nula e qualquer número de valores nulos. Qual é a utilidade disso?
ConcurrentHashMap
não suporta chaves nulas, mas HashMap
sim.
HashMap permite uma chave nula e qualquer número de valores nulos. Qual é a utilidade disso?
ConcurrentHashMap
não suporta chaves nulas, mas HashMap
sim.
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);
HashMap
lida 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?
val
como null
se a chave não existir; o meu define para qualquer null
mapa no mapa. Esse era o ponto, eu armazenei um valor não nulo padrão na null
chave do mapa e o utilizo se a chave real não existir
Um exemplo de uso de null
valores é ao usar um HashMap
como cache para resultados de uma operação cara (como uma chamada para um serviço da web externo) que pode retornar null
.
Colocar um null
valor 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 null
valor ( cache.containsKey(someKey)
retorna true
, cache.get(someKey)
retorna null
).
Sem null
valores, você teria que colocar algum valor especial no cache para indicar uma null
resposta 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 null
chave, mas a pergunta também pergunta sobre any number of null values
.
O benefício de armazenar o valor em null
relaçã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 null
chave 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 Exception
perto. Além disso, tentar parar um cronômetro inexistente ou já parado é algo do qual o chamador geralmente pode se recuperar.