Ich habe folgenden Code:
if(!partialHits.get(req_nr).containsKey(z) || partialHits.get(req_nr).get(z) < tmpmap.get(z)){
partialHits.get(z).put(z, tmpmap.get(z));
}
Wo partialHits
ist eine HashMap?
Was passiert, wenn die erste Aussage wahr ist? Wird Java die zweite Anweisung noch überprüfen? Da die erste Anweisung wahr sein soll, sollte die HashMap nicht den angegebenen Schlüssel enthalten. Wenn also die zweite Anweisung aktiviert ist, erhalte ich NullPointerException
.
Also in einfachen Worten, wenn wir den folgenden Code haben
if(a && b)
if(a || b)
Würde Java prüfen, b
ob a
es im ersten Fall falsch ist und ob a
es im zweiten Fall wahr ist?
quelle
*
und+
als logischesand
undor
;((A?1:0) * (B?1:0)) == 1
,((A?1:0) + (B?1:0)) > 0
. Sie können sogar tunxor
:((A?1:0) + (B?1:0)) == 1
.boolean
(logischer) Operator. Es ist anders als derbitwise
(ganzzahlige) Operator, obwohl es das gleiche Symbol hat ...!(str != null && !str.isEmpty())
wird:(str !(!=) null !(&&) !(!)str.isEmpty())
und dann:(str == null || str.isEmpty())
weil:!(!=) is ==
!(&&) is ||
!(!) eliminates itself
andere hilfreiche Negationen sind:!(<) is >=
!(>) is <=
und umgekehrtJava hat 5 verschiedene boolesche Vergleichsoperatoren: &, &&, |, ||, ^
& und && sind "und" Operatoren, | und || "oder" Operatoren, ^ ist "xor"
Die einzelnen prüfen jeden Parameter, unabhängig von den Werten, bevor sie die Werte der Parameter prüfen. Die doppelten überprüfen zuerst den linken Parameter und seinen Wert und wenn
true
(||
) oderfalse
(&&
), lassen Sie den zweiten unberührt. Sound zusammengestellt? Ein einfaches Beispiel sollte deutlich machen:Für alle Beispiele angegeben:
UND:
Beide Parameter werden vor Abschluss der Auswertung überprüft und für den zweiten Parameter wird eine NullPointerException ausgelöst.
Der erste Parameter wird überprüft und es wird zurückgegeben
false
, sodass der zweite Parameter nicht überprüft wird, da das Ergebnisfalse
sowieso ist.Gleiches gilt für OR:
Löst auch eine NullPointerException aus.
Der erste Parameter wird überprüft und es wird zurückgegeben
true
, sodass der zweite Parameter nicht überprüft wird, da das Ergebnistrue
sowieso ist.XOR kann nicht optimiert werden, da es von beiden Parametern abhängt.
quelle
^
(xor).Nein, es wird nicht überprüft. Dieses Verhalten wird als Kurzschlussauswertung bezeichnet und ist in vielen Sprachen, einschließlich Java, eine Funktion.
quelle
Alle Antworten hier sind großartig, aber um zu veranschaulichen, woher dies kommt, ist es für Fragen wie diese gut, zur Quelle zu gehen: der Java-Sprachspezifikation.
In Abschnitt 15:23, Bedingter Und Operator (&&) , heißt es:
In ähnlicher Weise heißt es in Abschnitt 15:24, Bedingter-Oder-Operator (||) :
Ein bisschen repetitiv vielleicht, aber die beste Bestätigung dafür, wie sie genau funktionieren. In ähnlicher Weise wertet der bedingte Operator (? :) nur die entsprechende 'Hälfte' aus (linke Hälfte, wenn der Wert wahr ist, rechte Hälfte, wenn er falsch ist) und erlaubt die Verwendung von Ausdrücken wie:
ohne eine NullPointerException.
quelle
Nein, wenn a wahr ist (in einem
or
Test), wird b nicht getestet, da das Ergebnis des Tests immer wahr ist, unabhängig vom Wert des Ausdrucks b.Machen Sie einen einfachen Test:
wird nicht werfen ein
NullPointerException
!quelle
Kurzschluss bedeutet hier, dass die zweite Bedingung nicht ausgewertet wird.
Wenn (A && B) zu einem Kurzschluss führt, wenn A falsch ist.
Wenn (A && B) nicht zu einem Kurzschluss führt, wenn A wahr ist.
Wenn (A || B) zu einem Kurzschluss führt, wenn A True ist.
Wenn (A || B) nicht zu einem Kurzschluss führt, wenn A falsch ist.
quelle
Nein, Java wird kurzschließen und die Auswertung beenden, sobald das Ergebnis bekannt ist.
quelle
Ja, die Kurzschlussauswertung für boolesche Ausdrücke ist das Standardverhalten in der gesamten C-ähnlichen Familie.
Eine interessante Tatsache ist, dass Java auch die
&
und|
als logische Operanden verwendet (sie sind überladen, mitint
Typen sind sie die erwarteten bitweisen Operationen), um alle Begriffe im Ausdruck auszuwerten, was auch nützlich ist, wenn Sie die Nebenwirkungen benötigen.quelle
Dies geht zurück auf den grundlegenden Unterschied zwischen & und &&, | und ||
Übrigens führen Sie die gleichen Aufgaben oft aus. Ich bin mir nicht sicher, ob Effizienz ein Problem ist. Sie könnten einige der Duplikate entfernen.
quelle