Логические операторы Java

Java не считает 0 ложью, а ненулевое число истиной: логические выражения должны иметь тип boolean.

ОператорСмыслВычисление правой части
a && bИтолько если a == true
a || bИЛИтолько если a == false
!aНЕ—
a ^ bXORвсегда
a & bboolean И или побитовое Ивсегда
a | bboolean ИЛИ или побитовое ИЛИвсегда

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 вычисляются? Нет.