Eu tenho o seguinte código:
if(!partialHits.get(req_nr).containsKey(z) || partialHits.get(req_nr).get(z) < tmpmap.get(z)){
partialHits.get(z).put(z, tmpmap.get(z));
}
Onde partialHits
está um HashMap.
O que acontecerá se a primeira afirmação for verdadeira? O Java ainda verificará a segunda instrução? Como para que a primeira instrução seja verdadeira, o HashMap não deve conter a chave fornecida, portanto, se a segunda instrução estiver marcada, receberei NullPointerException
.
Então, em palavras simples, se tivermos o seguinte código
if(a && b)
if(a || b)
Java verificaria b
se a
é falso no primeiro caso e se a
é verdadeiro no segundo caso?
fonte
*
e+
como lógicoand
eor
;((A?1:0) * (B?1:0)) == 1
,((A?1:0) + (B?1:0)) > 0
. Você mesmo pode fazerxor
:((A?1:0) + (B?1:0)) == 1
.boolean
operador (lógico). É diferente do que obitwise
operador (inteiro), apesar de ter o mesmo símbolo ...!(str != null && !str.isEmpty())
torna-se:(str !(!=) null !(&&) !(!)str.isEmpty())
e então:(str == null || str.isEmpty())
porque:!(!=) is ==
!(&&) is ||
!(!) eliminates itself
outras negações votos são:!(<) is >=
!(>) is <=
e vice-versaJava possui 5 operadores de comparação booleanos diferentes: &, &&, |, ||, ^
& e && são operadores "e", | e || "ou" operadores, ^ é "xor"
Os únicos verificarão todos os parâmetros, independentemente dos valores, antes de verificar os valores dos parâmetros. Os duplos primeiro verificarão o parâmetro esquerdo e seu valor e se
true
(||
) oufalse
(&&
) deixarão o segundo intocado. Som compilado? Um exemplo fácil deve deixar claro:Dados para todos os exemplos:
E:
Ambos os parâmetros são verificados antes da avaliação ser concluída e uma NullPointerException será lançada para o segundo parâmetro.
O primeiro parâmetro é verificado e retorna
false
, para que o segundo parâmetro não seja verificado, porque o resultado é ofalse
mesmo.O mesmo para OR:
Também aumentará NullPointerException.
O primeiro parâmetro é verificado e retorna
true
, para que o segundo parâmetro não seja verificado, porque o resultado é otrue
mesmo.O XOR não pode ser otimizado, porque depende dos dois parâmetros.
fonte
^
(xor).Não, não será verificado. Esse comportamento é chamado de avaliação de curto-circuito e é um recurso em muitas linguagens, incluindo Java.
fonte
Todas as respostas aqui são ótimas, mas, apenas para ilustrar de onde isso vem, para perguntas como essa, é bom ir para a fonte: a Java Language Specification.
Seção 15:23, Conditional-operador E (&&) , diz:
E da mesma forma, a Seção 15:24, Operador Condicional-Ou (||) , diz:
Um pouco repetitivo, talvez, mas a melhor confirmação de exatamente como eles funcionam. Da mesma forma, o operador condicional (? :) apenas avalia a 'metade' apropriada (metade esquerda se o valor for verdadeiro, metade direita se for falso), permitindo o uso de expressões como:
sem uma NullPointerException.
fonte
Não, se a for verdadeiro (em um
or
teste), b não será testado, pois o resultado do teste sempre será verdadeiro, qualquer que seja o valor da expressão b.Faça um teste simples:
não vai jogar um
NullPointerException
!fonte
Curto-circuito aqui significa que a segunda condição não será avaliada.
Se (A && B) resultará em curto-circuito se A for Falso.
Se (A && B) não resultará em curto-circuito se A for Verdadeiro.
Se (A || B) resultará em curto-circuito se A for Verdadeiro.
Se (A || B) não resultará em curto-circuito se A for Falso.
fonte
Não, não será, o Java entrará em curto-circuito e deixará de avaliar quando souber o resultado.
fonte
Sim, a avaliação de curto-circuito para expressões booleanas é o comportamento padrão em toda a família C.
Um fato interessante é que Java também utiliza o
&
e|
como operandos lógicas (eles estão sobrecarregados, comint
tipos que são as operações bit a bit esperados) para avaliar todos os termos na expressão, que também é útil quando você precisa dos efeitos colaterais.fonte
Isso remonta à diferença básica entre & e &&, | e ||
BTW, você executa as mesmas tarefas várias vezes. Não tenho certeza se a eficiência é um problema. Você pode remover parte da duplicação.
fonte