J'ai le code suivant:
if(!partialHits.get(req_nr).containsKey(z) || partialHits.get(req_nr).get(z) < tmpmap.get(z)){
partialHits.get(z).put(z, tmpmap.get(z));
}
où partialHits
est un HashMap.
Que se passera-t-il si la première affirmation est vraie? Java vérifiera-t-il toujours la deuxième instruction? Parce que pour que la première instruction soit vraie, le HashMap ne doit pas contenir la clé donnée, donc si la deuxième instruction est vérifiée, j'obtiendrai NullPointerException
.
Donc en termes simples, si nous avons le code suivant
if(a && b)
if(a || b)
Java vérifierait-il b
si a
est faux dans le premier cas et si a
est vrai dans le second cas?
la source
*
et+
comme logiqueand
etor
;((A?1:0) * (B?1:0)) == 1
,((A?1:0) + (B?1:0)) > 0
. Vous pouvez même le fairexor
:((A?1:0) + (B?1:0)) == 1
.boolean
opérateur (logique). C'est différent de l'bitwise
opérateur (entier), malgré le même symbole ...!(str != null && !str.isEmpty())
devient:(str !(!=) null !(&&) !(!)str.isEmpty())
et ensuite:(str == null || str.isEmpty())
parce que: d'!(!=) is ==
!(&&) is ||
!(!) eliminates itself
autres négations utiles sont:!(<) is >=
!(>) is <=
et viceJava a 5 opérateurs de comparaison booléens différents: &, &&, |, ||, ^
& et && sont des opérateurs "et", | et || Opérateurs "ou", ^ est "xor"
Les simples vérifieront chaque paramètre, quelles que soient les valeurs, avant de vérifier les valeurs des paramètres. Les doubles vérifieront d'abord le paramètre de gauche et sa valeur et si
true
(||
) oufalse
(&&
) laisseront le second inchangé. Son compilé? Un exemple simple devrait le rendre clair:Donné pour tous les exemples:
ET:
Les deux paramètres sont vérifiés avant la fin de l'évaluation et une exception NullPointerException sera lancée pour le deuxième paramètre.
Le premier paramètre est vérifié et il retourne
false
, donc le deuxième paramètre ne sera pas vérifié, car le résultat est defalse
toute façon.Idem pour OR:
Lèvera également NullPointerException.
Le premier paramètre est vérifié et il retourne
true
, donc le deuxième paramètre ne sera pas vérifié, car le résultat est detrue
toute façon.XOR ne peut pas être optimisé, car il dépend des deux paramètres.
la source
^
(xor).Non, il ne sera pas vérifié. Ce comportement est appelé évaluation de court-circuit et est une fonctionnalité dans de nombreux langages, y compris Java.
la source
Toutes les réponses ici sont excellentes mais, juste pour illustrer d'où cela vient, pour des questions comme celle-ci, il est bon d'aller à la source: la spécification du langage Java.
La section 15:23, Opérateur conditionnel-et (&&) , dit:
Et de même, Section 15:24, Opérateur Conditional-Or (||) , dit:
Un peu répétitif, peut-être, mais la meilleure confirmation de leur fonctionnement exact. De même, l'opérateur conditionnel (? :) n'évalue que la 'moitié' appropriée (moitié gauche si la valeur est vraie, moitié droite si elle est fausse), permettant l'utilisation d'expressions comme:
sans NullPointerException.
la source
Non, si a est vrai (dans un
or
test), b ne sera pas testé, car le résultat du test sera toujours vrai, quelle que soit la valeur de l'expression b.Faites un test simple:
ne pas jeter un
NullPointerException
!la source
Un court-circuit signifie ici que la deuxième condition ne sera pas évaluée.
Si (A && B) entraînera un court-circuit si A est faux.
Si (A && B) n'entraînera pas de court-circuit si A est vrai.
Si (A || B) entraînera un court-circuit si A est vrai.
Si (A || B) n'entraînera pas de court-circuit si A est faux.
la source
Non, ce ne sera pas le cas, Java court-circuitera et arrêtera d'évaluer une fois qu'il connaîtra le résultat.
la source
Oui, l'évaluation de court-circuit pour les expressions booléennes est le comportement par défaut dans toute la famille C-like.
Un fait intéressant est que Java utilise également
&
et|
comme opérandes logiques (ils sont surchargés, avec desint
types, ce sont les opérations au niveau du bit attendues) pour évaluer tous les termes de l'expression, ce qui est également utile lorsque vous avez besoin des effets secondaires.la source
Cela revient à la différence fondamentale entre & et &&, | et ||
BTW vous effectuez les mêmes tâches plusieurs fois. Je ne sais pas si l'efficacité est un problème. Vous pouvez supprimer une partie de la duplication.
la source