Tengo el siguiente 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));
}
donde partialHits
es un HashMap
¿Qué pasará si la primera afirmación es verdadera? ¿Java aún verificará la segunda declaración? Porque para que la primera declaración sea verdadera, el HashMap no debe contener la clave dada, por lo que si la segunda declaración está marcada, obtendré NullPointerException
.
En palabras simples, si tenemos el siguiente código
if(a && b)
if(a || b)
¿Java comprobaría b
si a
es falso en el primer caso y si a
es verdadero en el segundo caso?
java
if-statement
Azimut
fuente
fuente
*
y+
como lógicoand
yor
;((A?1:0) * (B?1:0)) == 1
,((A?1:0) + (B?1:0)) > 0
. Incluso se puede hacerxor
:((A?1:0) + (B?1:0)) == 1
.boolean
operador (lógico). Es diferente que elbitwise
operador (entero), a pesar de tener el mismo símbolo ...!(str != null && !str.isEmpty())
convierte en:(str !(!=) null !(&&) !(!)str.isEmpty())
y luego:(str == null || str.isEmpty())
porque:!(!=) is ==
!(&&) is ||
!(!) eliminates itself
otras negaciones útiles son:!(<) is >=
!(>) is <=
y viceversaJava tiene 5 operadores booleanos de comparación diferentes: &, &&, |, ||, ^
& y && son operadores "y", | y || "u" operadores, ^ es "xor"
Los únicos verificarán cada parámetro, independientemente de los valores, antes de verificar los valores de los parámetros. Los dobles primero verifican el parámetro izquierdo y su valor y si
true
(||
) ofalse
(&&
) dejan el segundo sin tocar. ¿Sonido compilado? Un ejemplo sencillo debería aclararlo:Dado para todos los ejemplos:
Y:
Ambos parámetros se verifican antes de que se realice la evaluación y se lanzará una NullPointerException para el segundo parámetro.
El primer parámetro se verifica y regresa
false
, por lo que el segundo parámetro no se verificará porque el resultado es defalse
todos modos.Lo mismo para OR:
También generará NullPointerException.
El primer parámetro se verifica y regresa
true
, por lo que el segundo parámetro no se verificará porque el resultado es detrue
todos modos.XOR no se puede optimizar, porque depende de ambos parámetros.
fuente
^
(xor).No, no se comprobará. Este comportamiento se denomina evaluación de cortocircuito y es una característica en muchos idiomas, incluido Java.
fuente
Todas las respuestas aquí son geniales, pero, solo para ilustrar de dónde viene esto, para preguntas como esta es bueno ir a la fuente: la Especificación del lenguaje Java.
La Sección 15:23, Operador condicional y (&&) , dice:
Y de manera similar, la Sección 15:24, Operador Condicional-O (||) , dice:
Un poco repetitivo, tal vez, pero la mejor confirmación de cómo funcionan exactamente. De manera similar, el operador condicional (? :) solo evalúa la 'mitad' apropiada (mitad izquierda si el valor es verdadero, mitad derecha si es falso), permitiendo el uso de expresiones como:
sin una excepción NullPointerException.
fuente
No, si a es verdadero (en una
or
prueba), b no se probará, ya que el resultado de la prueba siempre será verdadero, sea cual sea el valor de la expresión b.Haz una prueba simple:
será no lanzar una
NullPointerException
!fuente
Cortocircuito aquí significa que la segunda condición no será evaluada.
Si (A y B) dará como resultado un cortocircuito si A es falso.
Si (A y B) no generará un cortocircuito si A es verdadero.
Si (A || B) provocará un cortocircuito si A es verdadero.
Si (A || B) no provocará un cortocircuito si A es falso.
fuente
No, no lo hará, Java hará un cortocircuito y dejará de evaluar una vez que sepa el resultado.
fuente
Sí, la evaluación de cortocircuito para expresiones booleanas es el comportamiento predeterminado en toda la familia tipo C.
Un hecho interesante es que Java también usa los
&
y|
como operandos lógicos (están sobrecargados, conint
tipos son las operaciones bit a bit esperadas) para evaluar todos los términos en la expresión, lo que también es útil cuando necesita los efectos secundarios.fuente
Esto se remonta a la diferencia básica entre & y &&, | y ||
Por cierto, realiza las mismas tareas muchas veces. No estoy seguro si la eficiencia es un problema. Puede eliminar parte de la duplicación.
fuente