Карта / Управление потоком / Управление потоком

Управление потоком

Обычно код идёт сверху вниз, строка за строкой. Управление потоком даёт две силы: ветвиться (выбрать путь) и повторять (цикл).

if / else — развилка

«Если условие — иди сюда, иначе — туда». Как развилка на дороге.

возраст ≥ 18 ? да нет пускаем не пускаем
if (age >= 18) {
    System.out.println("пускаем");
} else {
    System.out.println("не пускаем");
}

Цикл — повтор

«Сделай 5 раз». Тело повторяется, пока условие верно.

i = 0 1 2 3 4 повторяем тело, пока i < 5
for (int i = 0; i < 5; i++) {   // i от 0 до 4
    System.out.println(i);
}

int n = 3;
while (n > 0) {                 // пока условие верно
    n--;
}

break — выйти из цикла досрочно. continue — пропустить текущий шаг и пойти на следующий.

Копнуть глубже

switch — когда веток много. Вместо лесенки if — else if — else if берут switch: значение «раскидывается» по веткам.

switch(day) case 1 → "Пн" case 2 → "Вт" default → "?"
String name = switch (day) {
    case 1 -> "Понедельник";
    case 2 -> "Вторник";
    default -> "Другой день";
};

Какой цикл когда:

ЦиклКогда брать
forизвестно, сколько раз
whileпока условие верно (число неизвестно)
do-whileвыполнить хотя бы раз, потом проверка
for-eachпройтись по коллекции/массиву без индекса
for (String name : names) {   // for-each — по каждому элементу
    System.out.println(name);
}

Тернарный оператор — короткий if для присваивания: String s = age >= 18 ? "взрослый" : "ребёнок";

Под капотом

В процессоре нет «if» — есть только сравнение и прыжок. Компилятор превращает if в инструкции: сравнить → если условие ложно, перепрыгнуть (goto) через тело.

сравнить x и 0 если x ≤ 0 — прыжок ↓ тело if { ... } else { ... } goto

Что из этого следует:

  • Предсказание ветвлений (branch prediction). Процессор заранее «угадывает», по какой ветке пойдёт if, и начинает её выполнять. Угадал — быстро; промахнулся — небольшая задержка. Поэтому предсказуемые условия работают быстрее хаотичных.
  • JIT разворачивает циклы (loop unrolling). Горячий цикл компилятор может «развернуть» — выполнить несколько шагов за один проход, чтобы реже проверять условие.
  • Бесконечный цикл. while (true) без break или выхода будет крутиться вечно — частая ошибка новичка. У цикла всегда должно быть условие выхода.
🎤 Закрыл тему, если можешь объяснить:
• чем `if/else` отличается от цикла, что делают `break` и `continue`;
• когда `switch`, а когда разные циклы (если дошёл до 2-го слоя);
• во что превращается `if` под капотом и что такое предсказание ветвлений (если дошёл до 3-го слоя).