10/10/2026

Java. Управляющие конструкции

Условные операторы (if/else, switch), циклы (for, while, do-while).

1. Условные операторы

Программа должна уметь реагировать на разные ситуации: «если пользователь ввёл правильный пароль — пускай, иначе — покажи ошибку». Для этого и нужны условия. if — простое условие

if-else — если условие не выполнилось

if-else if-else — несколько условий

Тернарный оператор — короткая запись if-else Когда нужно просто выбрать одно из двух значений:

int age = 20;
String status = (age >= 18) ? "взрослый" : "ребёнок";
// Эквивалент:
// if (age >= 18) status = "взрослый";
// else status = "ребёнок";

2. Оператор switch

Когда нужно сравнить одну переменную с множеством конкретных значений, switch читается лучше, чем длинная цепочка if-else if. Классический switch

int day = 3;
String dayName;

switch (day) {
    case 1:
        dayName = "Понедельник";
        break;
    case 2:
        dayName = "Вторник";
        break;
    case 3:
        dayName = "Среда";
        break;
    case 4:
        dayName = "Четверг";
        break;
    case 5:
        dayName = "Пятница";
        break;
    case 6:
    case 7:
        dayName = "Выходной";
        break;
    default:
        dayName = "Неизвестный день";
        break;
}

System.out.println(dayName); // "Среда"

⚠️ Критически важно: слово break! Без него программа продолжит выполнение следующих case — это называется fall-through (проваливание).

Современный switch (Java 14+) — switch expression В новых версиях Java switch стал намного удобнее. Стрелка -> автоматически прерывает выполнение, и break больше не нужен:

int day = 3;

String dayName = switch (day) {
    case 1 -> "Понедельник";
    case 2 -> "Вторник";
    case 3 -> "Среда";
    case 4 -> "Четверг";
    case 5 -> "Пятница";
    case 6, 7 -> "Выходной";
    default -> "Неизвестный день";
};

System.out.println(dayName); // "Среда"

3. Циклы

Циклы позволяют повторять одно и то же действие много раз. В Java есть три основных типа. for — когда известно количество повторений

for (инициализация; условие; шаг) {
    // тело цикла
}

Цикл for-each (улучшенный for) Когда нужно пройти по всем элементам массива или коллекции:

int[] numbers = {10, 20, 30, 40, 50};

for (int num : numbers) {
    System.out.println(num);
}

💡 Когда использовать for-each: когда тебе не важен индекс элемента, а нужно просто обработать все значения. Если нужен индекс — используй обычный for.

while — пока условие истинно

while (условие) {
    // тело цикла
}

do-while — сделать хотя бы один раз

do {
    // тело цикла
} while (условие);

Отличие от while: условие проверяется после выполнения тела. Значит, тело выполнится минимум один раз, даже если условие сразу false.

Сравнение циклов

ЦиклКогда использовать
forИзвестно количество итераций (например, «пройти 10 раз»)
for-eachПеребор элементов массива/коллекции без индекса
whileНеизвестно сколько раз, цикл идёт «пока что-то не случится»
do-whileНужно выполнить тело хотя бы один раз (например, запрос ввода)

4. break и continue — управление внутри цикла

break — немедленно выйти из цикла

for (int i = 1; i <= 10; i++) {
    if (i == 5) {
        break; // выходим из цикла, когда i == 5
    }
    System.out.println(i);
}
// Выведет: 1, 2, 3, 4

continue — пропустить текущую итерацию и перейти к следующей

for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) {
        continue; // пропускаем чётные числа
    }
    System.out.println(i);
}
// Выведет: 1, 3, 5, 7, 9

5. Вложенные циклы

Цикл может находиться внутри другого цикла. Классический пример — таблица умножения:

for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= 9; j++) {
        System.out.print(i * j + "\t");
    }
    System.out.println(); // переход на новую строку
}

🎯 Мини-задания для практики

Попробуй написать в IntelliJ IDEA:

  1. FizzBuzz — классическая задача. Выведи числа от 1 до 100. Но: Если число делится на 3 — выведи «Fizz» Если делится на 5 — выведи «Buzz» Если делится и на 3, и на 5 — выведи «FizzBuzz» Иначе — само число

  2. Калькулятор оценок — запроси у пользователя оценку (0–100) и выведи: 90–100: «A» 80–89: «B» 70–79: «C» 60–69: «D» Меньше 60: «F» Используй switch с диапазонами (подсказка: в Java 21 можно использовать case 90, 91, 92, ... или case Integer i when i >= 90 ->)

  3. Рисунок звёздочками — выведи в консоль треугольник:

   *
   **
   ***
   ****
   *****

Используй вложенные циклы.

Вопросы с собеседований

1) Что такое побитовые операции?

Побитовые операции — это операции над цепочками битов, которые включают в себя логические операции и побитовые сдвиги.

Логические операции: побитовое И — сравнивает битовые значения, и по ходу этого любой бит, установленный в 0 (false), устанавливает соответствующий бит в результате как 0. То есть, если в обоих сравниваемых значениях бит был 1 (true), в результирующем тоже будет 1.

Обозначается как — AND, &

Пример: 10111101 & 01100111 = 00100101

побитовое ИЛИ — операция, обратная предыдущей. Любой бит, установленный в 1, устанавливает аналогичный бит в результате как 1. И соответственно, если в обоих сравниваемых значениях бит был 0, в результирующем тоже будет 0.

Обозначается как — OR, |

Пример: 10100101 | 01100011 = 11100111

побитовое НЕ — применяется к одному значению, переворачивает (инвертирует) биты. То есть, те биты что были 1, станут 0; а те что были 0, станут 1.

Обозначается как — NOT, ~

Пример: ~10100101 = 01011010

побитовое исключающее ИЛИ — сравнивает битовые значения, и если в обоих значениях бит равен 1, то результат будет 0, также если в обоих значениях бит 0, результат будет 0. То есть, чтобы результат был равен 1, нужно, чтобы только один из битов был равен 1, а второй равен 0. Обозначается как — XOR, ^

Пример: 10100101 ^ 01100011 = 11000110

Побитовые сдвиги — >> или << сдвигают биты значения в указанную сторону, на указанное число. Освободившиеся позиции заполняются нулями.

Например: 01100011 >> 4 = 00000110 01100011 << 3 = 00011000 Также есть исключение при сдвиге вправо отрицательного числа.

Как вы помните, первый бит отвечает за знак, и если этот бит равен 1, то число отрицательное.

Если вы будете двигать отрицательное число, освободившиеся позиции будут заполняться уже не нулями, а единицами, так как необходимо поддерживать знаковый бит.

Например: 10100010 >> 2 = 11101000

При этом в Java существует дополнительный оператор беззнакового сдвига вправо >>>

Данный оператор — аналог >>, при сдвиге которым освободившиеся позиции заполняются 0, независимо от того, отрицательное число или положительное.

Например: 10100010 >>> 2 = 00101000

В качестве примеров использования побитовых сдвигов в Java, вы можете привести метод hash() у HashMap-ы, который используется для определения специального внутреннего хеш кода ключа:

Этом метод позволяет равномерно распределять данные в HashMap, чтобы минимизировать количество коллизий.