У меня есть следующий код:
if(!partialHits.get(req_nr).containsKey(z) || partialHits.get(req_nr).get(z) < tmpmap.get(z)){
partialHits.get(z).put(z, tmpmap.get(z));
}
где partialHits
хэш-карта
Что будет, если первое утверждение верно? Будет ли Java проверять второе утверждение? Потому что для того, чтобы первый оператор был истинным, HashMap не должен содержать заданный ключ, поэтому, если второй оператор проверен, я получу NullPointerException
.
Итак, простыми словами, если у нас есть следующий код
if(a && b)
if(a || b)
будет ли Java проверять b
, a
является ли false в первом случае, и если a
true во втором случае?
java
if-statement
азимут
источник
источник
*
и+
как логические, такand
иor
;((A?1:0) * (B?1:0)) == 1
,((A?1:0) + (B?1:0)) > 0
. Вы даже можете сделатьxor
:((A?1:0) + (B?1:0)) == 1
.boolean
(логический) оператор. Он отличается отbitwise
(целочисленного) оператора, несмотря на наличие одного и того же символа ...!(str != null && !str.isEmpty())
становится:(str !(!=) null !(&&) !(!)str.isEmpty())
и затем:(str == null || str.isEmpty())
потому что:!(!=) is ==
!(&&) is ||
!(!) eliminates itself
другие полезные отрицания:!(<) is >=
!(>) is <=
и наоборотВ Java есть 5 различных логических операторов сравнения: &, &&, |, ||, ^
& и && являются операторами "и", | и || "или" операторы, ^ это "XOR"
Отдельные проверят каждый параметр, независимо от значений, перед проверкой значений параметров. Двойные будут сначала проверять левый параметр и его значение, а если
true
(||
) илиfalse
(&&
) оставить второй нетронутым. Звук компилируется? Простой пример должен прояснить это:Дано для всех примеров:
И:
Оба параметра проверяются перед выполнением оценки, и для второго параметра будет сгенерировано исключение NullPointerException.
Первый параметр проверяется, и он возвращается
false
, поэтому второй параметр не будет проверен, потому что результат вfalse
любом случае.То же самое для ИЛИ:
Вызовет также NullPointerException.
Первый параметр проверяется, и он возвращается
true
, поэтому второй параметр не будет проверен, потому что результат вtrue
любом случае.XOR нельзя оптимизировать, потому что это зависит от обоих параметров.
источник
^
(xor).Нет, это не будет проверено. Такое поведение называется оценкой короткого замыкания и является функцией во многих языках, включая Java.
источник
Все ответы здесь великолепны, но, просто чтобы проиллюстрировать, откуда это взялось, для таких вопросов хорошо обратиться к источнику: спецификации языка Java.
Раздел 15:23, Условный оператор И (&&) , говорит:
И аналогично, в разделе 15:24, Оператор условного или (||) , говорится:
Возможно, немного повторяющееся, но лучшее подтверждение того, как именно они работают. Аналогично, условный оператор (? :) вычисляет только соответствующую «половину» (левую половину, если значение равно true, правую половину, если она равна false), что позволяет использовать выражения типа:
без исключения NullPointerException.
источник
Нет, если a равно true (в
or
тесте), b не будет проверяться, так как результат теста всегда будет true, независимо от значения выражения b.Сделайте простой тест:
будет не бросать
NullPointerException
!источник
Короткое замыкание здесь означает, что второе условие не будет оценено.
Если (A && B) приведет к короткому замыканию, если A ложно.
Если (A && B) не приведет к короткому замыканию, если A истинно.
Если (A || B) приведет к короткому замыканию, если A истинно.
Если (A || B) не приведет к короткому замыканию, если A ложно.
источник
Нет, не будет, Java закоротит и прекратит оценку, как только узнает результат.
источник
Да, оценка короткого замыкания для логических выражений является поведением по умолчанию во всем C-подобном семействе.
Интересным фактом является то, что Java также использует логические операнды
&
и в|
качестве (они перегружены, сint
типами, они являются ожидаемыми побитовыми операциями) для оценки всех терминов в выражении, что также полезно, когда вам нужны побочные эффекты.источник
Это восходит к основной разнице между & и &&, | и ||
Кстати, вы выполняете одни и те же задачи много раз. Не уверен, если эффективность является проблемой. Вы можете удалить некоторые дубликаты.
источник