Mam następujący kod:
if(!partialHits.get(req_nr).containsKey(z) || partialHits.get(req_nr).get(z) < tmpmap.get(z)){
partialHits.get(z).put(z, tmpmap.get(z));
}
gdzie partialHits
jest HashMap.
Co się stanie, jeśli pierwsze stwierdzenie jest prawdziwe? Czy Java nadal sprawdzi drugą instrukcję? Ponieważ aby pierwsza instrukcja była prawdziwa, HashMap nie powinien zawierać podanego klucza, więc jeśli druga instrukcja jest zaznaczona, otrzymam NullPointerException
.
Więc w prostych słowach, jeśli mamy następujący kod
if(a && b)
if(a || b)
czy Java sprawdzi, b
czy a
w pierwszym przypadku jest fałszywe, a czy a
jest prawdziwe w drugim?
źródło
*
i+
jako logicznegoand
ior
;((A?1:0) * (B?1:0)) == 1
,((A?1:0) + (B?1:0)) > 0
. Można nawet zrobićxor
:((A?1:0) + (B?1:0)) == 1
.boolean
operator (logiczny). Jest inny niżbitwise
operator (liczba całkowita), mimo że ma ten sam symbol ...!(str != null && !str.isEmpty())
staje się:(str !(!=) null !(&&) !(!)str.isEmpty())
a potem:(str == null || str.isEmpty())
ponieważ:!(!=) is ==
!(&&) is ||
!(!) eliminates itself
inne pomocne negacje to:!(<) is >=
!(>) is <=
iJava ma 5 różnych logicznych operatorów porównania: &, &&, |, ||, ^
& i && są operatorami „i”, | i || „lub”, ^ to „xor”
Pojedyncze sprawdzą każdy parametr, niezależnie od wartości, przed sprawdzeniem wartości parametrów. Podwójne najpierw sprawdzą lewy parametr i jego wartość, a jeśli
true
(||
) lubfalse
(&&
) pozostawi drugi nietknięty. Skompilowany dźwięk? Prosty przykład powinien wyjaśnić:Podano dla wszystkich przykładów:
I:
Oba parametry są sprawdzane przed wykonaniem oceny, a dla drugiego parametru zostanie zgłoszony wyjątek NullPointerException.
Pierwszy parametr jest sprawdzany i zwraca
false
, więc drugi parametr nie będzie sprawdzany, ponieważ wynik ifalse
tak jest .To samo dotyczy OR:
Podniesie również NullPointerException.
Pierwszy parametr jest sprawdzany i zwraca
true
, więc drugi parametr nie będzie sprawdzany, ponieważ wynik itrue
tak jest .XOR nie może zostać zoptymalizowany, ponieważ zależy to od obu parametrów.
źródło
^
(xor).Nie, to nie będzie sprawdzane. Takie zachowanie nazywane jest oceną zwarć i jest funkcją w wielu językach, w tym w Javie.
źródło
Wszystkie odpowiedzi tutaj są świetne, ale aby zilustrować, skąd się to bierze, w przypadku takich pytań dobrze jest udać się do źródła: specyfikacji języka Java.
Sekcja 15:23, Operator warunkowy i (&&) , mówi:
I podobnie, sekcja 15:24, operator warunkowego lub (||) , mówi:
Może trochę powtarzalne, ale najlepsze potwierdzenie tego, jak dokładnie działają. Podobnie operator warunkowy (? :) oblicza tylko odpowiednią „połowę” (lewa połowa, jeśli wartość jest prawdą, prawa połowa, jeśli jest fałszywa), pozwalając na użycie wyrażeń takich jak:
bez wyjątku NullPointerException.
źródło
Nie, jeśli a jest prawdziwe (w
or
teście), b nie będzie testowane, ponieważ wynik testu będzie zawsze prawdziwy, niezależnie od wartości wyrażenia b.Zrób prosty test:
będzie nie rzucać
NullPointerException
!źródło
Zwarcie oznacza tutaj, że drugi warunek nie będzie oceniany.
Jeśli (A && B) spowoduje zwarcie, jeśli A jest fałszywe.
Jeśli (A && B) nie spowoduje zwarcia, jeśli A jest Prawdą.
Jeśli (A || B) spowoduje zwarcie, jeśli A jest Prawdą.
Jeśli (A || B) nie spowoduje zwarcia, jeśli A jest fałszywe.
źródło
Nie, nie będzie, Java zakończy spięcie i przestanie oceniać, gdy zna wynik.
źródło
Tak, ocena zwarcia dla wyrażeń boolowskich jest domyślnym zachowaniem w całej rodzinie C-podobnej.
Ciekawostką jest to, że Java wykorzystuje również operandy logiczne
&
i|
jako (są one przeciążone, przyint
typach są oczekiwanymi operacjami bitowymi) do oceny wszystkich terminów w wyrażeniu, co jest również przydatne, gdy potrzebne są efekty uboczne.źródło
To wraca do podstawowej różnicy między & i &&, | i ||
Swoją drogą wykonujesz te same zadania wielokrotnie. Nie jestem pewien, czy problemem jest wydajność. Możesz usunąć część duplikatów.
źródło