W3docs

Java Booleans

Используйте тип boolean в Java для хранения значений true/false и построения условной логики.

boolean — простейший примитив: он имеет ровно два значения, true и false. Каждое условие в Java — if, while, тернарный оператор ?:, операнды && и || — требует boolean. Вам не нужно знать об этом типе очень много, но понимание разницы между boolean и Boolean поможет избежать будущих ошибок.

На этой странице рассматриваются: объявление boolean-переменных, места, где компилятор требует их наличия, логические операторы, класс-обёртка Boolean и ловушка с null, разбор строк и эффективное хранение множества флагов.

Объявление boolean

boolean isOpen = true;
boolean ready = false;
boolean canPay = (balance >= amount);

Ключевые слова — true и false — строчными буквами. Никаких True, TRUE, 1, 0 — Java строга в этом отношении.

Переменная boolean без инициализации имеет определённое значение по умолчанию только как поле (переменная экземпляра или статическая переменная), где оно равно false. Локальная переменная не имеет значения по умолчанию — попытка обратиться к ней до присваивания приведёт к ошибке компиляции:

class Light {
    boolean on;            // field — defaults to false

    void check() {
        boolean ready;     // local — no default
        // System.out.println(ready); // compile error: variable not initialized
        ready = true;
        System.out.println(ready); // OK now
    }
}

Boolean в условиях

Каждый if, while, do-while и средняя часть цикла for ожидают boolean:

boolean isAdult = age >= 18;

if (isAdult) {
    System.out.println("Welcome!");
}

while (!stopRequested) {
    process();
}

Использовать число там, где требуется boolean, нельзя:

int x = 5;
// if (x) { ... }   // compile error: int is not a boolean
if (x != 0) { ... } // OK

Это особенность, а не неудобство — она устраняет целый класс ошибок из языка C.

Логические операции

Три логических оператора (Логические операторы):

boolean a = true && false;   // false
boolean b = true || false;   // true
boolean c = !true;           // false

&& и || вычисляются по принципу короткого замыкания: в выражении a && b, если a равно false, b никогда не вычисляется; в a || b, если a равно true, b пропускается. Это позволяет делать защитные проверки, например s != null && s.isEmpty(). Побитовые операторы & и | вычисляют оба операнда — для boolean почти никогда не нужно именно это.

Распространённые идиомы

Не сравнивайте boolean с true или false — используйте переменную напрямую. Переменная и есть условие:

if (isOpen == true) { }   // redundant
if (isOpen) { }           // idiomatic

if (isOpen == false) { }  // redundant
if (!isOpen) { }          // idiomatic

Чтобы переключить флаг, присвойте ему его отрицание. Это стандартный паттерн «переключения»:

boolean visible = true;
visible = !visible;   // now false
visible = !visible;   // back to true

Boolean — класс-обёртка

Класс-обёртка Boolean позволяет помещать boolean-значения в коллекции и передавать их как объекты:

List<Boolean> answers = new ArrayList<>();
answers.add(true);
answers.add(false);

Map<String, Boolean> flags = new HashMap<>();
flags.put("debug", true);

Автоупаковка автоматически преобразует между boolean и Boolean. Главное, за чем нужно следить: ссылка типа Boolean может быть null, а примитивный boolean — нет.

Boolean maybe = null;
if (maybe) { ... }   // throws NullPointerException — autounbox on null

Используйте Boolean.TRUE.equals(maybe) или явную проверку на null, если значение null возможно.

Разбор строк

Boolean.parseBoolean(s) возвращает true, если строка равна "true" (без учёта регистра), и false во всех остальных случаях — включая опечатки и неожиданные значения:

Boolean.parseBoolean("true");      // true
Boolean.parseBoolean("TRUE");      // true
Boolean.parseBoolean("yes");       // false
Boolean.parseBoolean("1");         // false
Boolean.parseBoolean(null);        // false

Если вам нужна строгая валидация входных данных, напишите собственную проверку, а не полагайтесь на семантику «всё-что-не-true-это-false» этого метода.

boolean[] vs BitSet

Для небольшого числа boolean-значений boolean[] вполне подходит и хорошо читается:

boolean[] flags = new boolean[8];
flags[3] = true;

Для тысяч или миллионов флагов BitSet эффективнее по памяти — внутри он упаковывает флаги в long-значения:

import java.util.BitSet;

BitSet seen = new BitSet();
seen.set(42);
System.out.println(seen.get(42));   // true

Демонстрация

java— editable, runs on the server

Что дальше

Символы Java (char) — 16-битный примитив, хранящий одну кодовую единицу Unicode.

Практика

Практика
Какое из выражений является допустимым boolean-выражением в Java?
Какое из выражений является допустимым boolean-выражением в Java?
Was this page helpful?