A verificação da existência de chaves no HashMap é sempre necessária?
Eu tenho um HashMap com, digamos, 1000 entradas e estou procurando melhorar a eficiência. Se o HashMap estiver sendo acessado com muita frequência, verificar a existência da chave em todos os acessos resultará em uma grande sobrecarga. Em vez disso, se a chave não estiver presente e, portanto, ocorrer uma exceção, eu posso capturar a exceção. (quando eu sei que isso acontecerá raramente). Isso reduzirá os acessos ao HashMap pela metade.
Isso pode não ser uma boa prática de programação, mas me ajudará a reduzir o número de acessos. Ou estou faltando alguma coisa aqui?
[ Update ] Não tenho valores nulos no HashMap.
Respostas:
Você já armazena um valor nulo? Caso contrário, você pode simplesmente fazer:
Caso contrário, você poderá verificar a existência se receber um valor nulo retornado:
fonte
get
bem e evita fazer duas pesquisas quando você precisar do valor também.if(value!=null || map.containsKey(key))
para a segunda parte. Pelo menos se você quiser fazer a mesma coisa de qualquer maneira - nenhum código repetido. Funcionará devido a curto-circuito .Você não ganhará nada verificando se a chave existe. Este é o código de
HashMap
:Basta verificar se o valor de retorno para
get()
é diferente denull
.Este é o código fonte do HashMap.
Recursos :
Código-fonte HashMapBad umfonte
Melhor maneira é usar o
containsKey
método deHashMap
. Amanhã alguém adicionará nulo ao mapa. Você deve diferenciar entre presença de chave e chave com valor nulo.fonte
null
total.Você quer dizer que você tem código como
por todo o lugar ? Então você deve simplesmente verificar se
map.get(key)
retornou nulo e é isso. A propósito, o HashMap não lança exceções para chaves ausentes, mas retorna nulo. O único caso em quecontainsKey
é necessário é quando você está armazenando valores nulos, para distinguir entre um valor nulo e um valor ausente, mas isso geralmente é considerado uma má prática.fonte
Basta usar
containsKey()
para maior clareza. É rápido e mantém o código limpo e legível. O ponto principal deHashMap
s é que a pesquisa de chave é rápida, apenas certifique-se de quehashCode()
eequals()
esteja corretamente implementada.fonte
fonte
Você também pode usar o
computeIfAbsent()
método naHashMap
classeNo exemplo a seguir,
map
armazena uma lista de transações (números inteiros) aplicadas à chave (o nome da conta bancária). Para adicionar 2 transações de100
e200
parachecking_account
você, escreva:Dessa forma, você não precisa verificar se a chave
checking_account
existe ou não.computeIfAbsent()
.Realmente elegante! 👍
fonte
Eu costumo usar o idioma
Isso significa que você só bate no mapa duas vezes se a chave estiver faltando
fonte
fonte
A resposta de Jon Skeet aborda bem os dois cenários (mapa com
null
valor e nãonull
valor) de maneira eficiente.Sobre as entradas de número e a preocupação com eficiência, gostaria de acrescentar algo.
Um mapa com 1.000 entradas não é um mapa enorme.
Bem como um mapa com 5.000 ou 10.000 entradas.
Map
são projetados para fazer uma recuperação rápida com essas dimensões.Agora, assume que
hashCode()
as chaves do mapa fornecem uma boa distribuição.Se você pode usar um
Integer
tipo de chave, faça-o.Seu
hashCode()
método é muito eficiente, pois as colisões não são possíveis paraint
valores únicos :Se, para a chave, você precisar usar outro tipo interno, como
String
por exemplo, frequentemente usadoMap
, poderá haver algumas colisões, mas de mil a alguns milhares de objetos noMap
, você deve ter muito poucos comoString.hashCode()
método fornece uma boa distribuição.Se você usar um tipo personalizado, substitua
hashCode()
eequals()
corrija e garanta que, no geral,hashCode()
forneça uma distribuição justa.Você pode consultar o item 9 do
Java Effective
referente.Aqui está um post que detalha o caminho.
fonte