Условные операторы (if/else, switch), циклы (for, while, do-while).
Программа должна уметь реагировать на разные ситуации: «если пользователь ввёл правильный пароль — пускай, иначе — покажи ошибку». Для этого и нужны условия. if — простое условие
if-else — если условие не выполнилось
if-else if-else — несколько условий
Тернарный оператор — короткая запись if-else Когда нужно просто выбрать одно из двух значений:
int age = 20;
String status = (age >= 18) ? "взрослый" : "ребёнок";
// Эквивалент:
// if (age >= 18) status = "взрослый";
// else status = "ребёнок";Когда нужно сравнить одну переменную с множеством конкретных значений, 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); // "Среда"Циклы позволяют повторять одно и то же действие много раз. В 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 | Нужно выполнить тело хотя бы один раз (например, запрос ввода) |
break — немедленно выйти из цикла
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break; // выходим из цикла, когда i == 5
}
System.out.println(i);
}
// Выведет: 1, 2, 3, 4continue — пропустить текущую итерацию и перейти к следующей
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // пропускаем чётные числа
}
System.out.println(i);
}
// Выведет: 1, 3, 5, 7, 9Цикл может находиться внутри другого цикла. Классический пример — таблица умножения:
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:
FizzBuzz — классическая задача. Выведи числа от 1 до 100. Но: Если число делится на 3 — выведи «Fizz» Если делится на 5 — выведи «Buzz» Если делится и на 3, и на 5 — выведи «FizzBuzz» Иначе — само число
Калькулятор оценок — запроси у пользователя оценку (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 ->)
Рисунок звёздочками — выведи в консоль треугольник:
*
**
***
****
*****Используй вложенные циклы.
Побитовые операции — это операции над цепочками битов, которые включают в себя логические операции и побитовые сдвиги.
Логические операции: побитовое И — сравнивает битовые значения, и по ходу этого любой бит, установленный в 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, чтобы минимизировать количество коллизий.