Логические операторы Java
Java не считает 0 ложью, а ненулевое число истиной: логические выражения должны иметь тип boolean.
| Оператор | Смысл | Вычисление правой части |
|---|---|---|
a && b | И | только если a == true |
a || b | ИЛИ | только если a == false |
!a | НЕ | — |
a ^ b | XOR | всегда |
a & b | boolean И или побитовое И | всегда |
a | b | boolean ИЛИ или побитовое ИЛИ | всегда |
Short circuit
if (user != null && user.isActive()) {
allow();
}isActive() не вызывается при user == null. Замена && на & вычислит обе части и может привести к NullPointerException.
Short circuit используют и для дорогой второй проверки, но side effects внутри условий делают код хрупким:
boolean ok = validateHeader() && persist(); // лучше разделитьXOR
Для boolean a ^ b истинно, если значения различны; это эквивалентно a != b. Для целых ^ работает побитово — Побитовые операции.
Сравнение
==сравнивает примитивные значения;- для ссылок
==проверяет идентичность; - логическое равенство объектов обычно проверяют
Objects.equals(a, b); Double.NaN == Double.NaNложно;- сравнение строк через
==ошибочно зависит от интернирования.
Тернарный оператор
String label = active ? "active" : "disabled";Вычисляется только одна из двух ветвей. Вложенные ternary быстро ухудшают читаемость.
См. Условные конструкции Java.
На собеседовании
- Разница
&&и&для boolean? Первый short-circuit, второй вычисляет обе стороны. - Можно ли написать
if (1)? Нет. - Что сравнивает
==у объектов? Ссылочную идентичность. - XOR для boolean? Истина, когда операнды различаются.
- Обе ли ветви ternary вычисляются? Нет.