JavaRush /Курсы /Java Syntax Pro /Оператор множественного выбора в Java: switch

Оператор множественного выбора в Java: switch

Java Syntax Pro
13 уровень , 6 лекция
Открыта

1. Оператор множественного выбора — switch

Оператор множественного выбора – switch

В Java есть еще один интересный оператор, доставшийся в наследство от бабушки (языка C++). Это оператор switch. Его еще называют оператором множественного выбора. Выглядит он немного громоздко:

switch(выражение)
{
   case значение1: код1;
   case значение2: код2;
   case значение3: код3;
}

Внутри скобок указывается какое-нибудь выражение или переменная. Если значение выражений равно значение1, начинает выполняться код1, если равно значение2, начинает выполняться код2, если равно значение3 начинает выполняться код3.

Пример:

Код Вывод на экран
int temperature = 38;

switch(temperature)
{
   case 36: System.out.println("Низкая");
   case 37: System.out.println("Нормальная");
   case 38: System.out.println("Высокая");
} 
Высокая

2. Оператор break в switch

Важной особенностью работы switch является то, что программа просто перепрыгивает на нужную строку (на нужный блок кода) и затем выполняет все блоки кода до конца switch. Не только тот блок кода, который соответствует значению внутри switch, а все блоки кода до конца switch.

Пример:

Код Вывод на экран
int temperature = 36;

switch(temperature)
{
   case 36: System.out.println("Низкая");
   case 37: System.out.println("Нормальная");
   case 38: System.out.println("Высокая");
} 
Низкая
Нормальная
Высокая

При значении температуры 36, программа перейдет внутри switch на первый блок кода — первую строку, и после ее выполнения просто будут выполняться остальные блоки кода.

Если вы хотите, чтобы в каждом случае выполнялся только один блок кода, на который перепрыгнуло выполнение программы, вам после этого блока кода нужно написать оператор break;

Пример:

Код Вывод на экран
int temperature = 36;

switch(temperature)
{
   case 36:
      System.out.println("Низкая");
      break;
   case 37:
      System.out.println("Нормальная");
      break;
   case 38:
      System.out.println("Высокая");
}
Низкая

У последнего варианта в switch можно break не писать, все равно блок кода там последний.


3. Действие по умолчанию: default

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

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

Однако в switch есть возможность сделать поведение, аналогичное ветке else из if-else. Для этого нужно использовать ключевое слово default.

Если ни один case вариант внутри switch не совпал со значением выражения и в switch объявлен default, будет выполнен его код. Пример:

Код Вывод на экран
int temperature = 40;
switch(temperature)
{
   case 36:
      System.out.println("Низкая");
      break;
   case 37:
      System.out.println("Нормальная");
      break;
   case 38:
      System.out.println("Высокая");
      break;
   default:
      System.out.println("Нужна скорая");
}
Нужна скорая

4. Сравнение switch vs if-else

Оператор switch чем-то похож на оператор if-else, только он его более сложный вариант.

Вы всегда можете переписать код switch в виде нескольких if-ов. Пример:

Код со switch Код с if-else
int temperature = 40;
switch(temperature)
{
   case 36:
      System.out.println("Низкая");
      break;
   case 37:
      System.out.println("Нормальная");
      break;
   case 38:
      System.out.println("Высокая");
      break;
   default:
      System.out.println("Нужна скорая");
} 
int temperature = 40;

if (temperature == 36)
{
   System.out.println("Низкая");
}
else if (temperature == 37)
{
   System.out.println("Нормальная");
}
else if (temperature == 38)
{
   System.out.println("Высокая");
}
else
{
   System.out.println("Нужна скорая");
}

Код слева будет работать точно так же, как и код справа.

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



5. Что можно использовать в качестве параметра у switch?

Не все типы можно использовать в качестве значений для case внутри оператора switch. Сейчас там можно использовать литералы таких типов:

  • целые типы: byte, short, int
  • тип char
  • тип String
  • значения любого enum-типа

Никаких других типов писать в качестве значений внутри case нельзя.

Пример использования enum внутри switch:

Day day = Day.MONDAY;
switch (day)
{
   case MONDAY:
      System.out.println("Понедельник");
      break;
   case TUESDAY:
      System.out.println("Вторник");
      break;
   case WEDNESDAY:
      System.out.println("Среда");
      break;
   case THURSDAY:
      System.out.println("Четверг");
      break;
   case FRIDAY:
      System.out.println("Пятница");
      break;
   case SATURDAY:
      System.out.println("Суббота");
      break;
   case SUNDAY:
      System.out.println("Воскресенье");
      break;
}

Примечание. Если вы используете enum внутри switch, можно не писать имя класса перед каждым значением в case. Достаточно просто написать значение.



Комментарии (231)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Андрей Уровень 17
19 апреля 2025
Странный уровень... Вываливают кучу информации о коллекциях, причём она важная и нужная, но основательно мы затронем ту, которую 20 лет не используют. Про неё обязательно спросят на собеседовании? Хорошо, но сейчас мне эта информация зачем нужна, я вроде как учусь... И в конце такие - "О! А мы рассказывали вам про аналог if/else?" Ктоооо это структурировал? Такое чувство, что я в случайном порядке темы прохожу.
17 апреля 2025
Написал сразу коде case оператор return, а после успешной проверки задачи, Idea подсказала более лаконичное решение через еще не пройденный return switch:

        return switch (countOfCorner) {
            case 3 -> "Треугольник";
            case 4 -> "Четырехугольник";
            case 5 -> "Пятиугольник";
            case 6 -> "Шестиугольник";
            case 7 -> "Семиугольник";
            case 8 -> "Восьмиугольник";
            default -> "Другая фигура";
        };
Mikhail Savostin Уровень 15
5 апреля 2025
String shape = switch (countOfCorner) { case 3 -> "Треугольник"; case 4 -> "Четырехугольник"; case 5 -> "Пятиугольник"; case 6 -> "Шестиугольник"; case 7 -> "Семиугольник"; case 8 -> "Восьмиугольник"; default -> "Другая фигура"; }; return shape; } }
ShadyLine Уровень 32
18 марта 2025
Крутой и несложный урок! Весьма полезный и полагаю часто используемый оператор!
AndreyRjr Уровень 25
17 февраля 2025
На последней задаче в плагине в IntelliJ IDEA не отображаются условия
Anton Zhukov Уровень 12
5 марта 2025
У меня нормально отображается
Юлия Уровень 66
21 августа 2024
а видео внутри курса теперь только с vpn можно посмотреть?
Duxa552 Уровень 1
21 августа 2024
тем, кто из рф, то да...
Antariko Уровень 1
20 сентября 2024
Прекрасно всё открывается и без впн.
Сергей Лаптев Уровень 36
12 октября 2024
Ну или с мобильного интернета, открыть последнее задание в приложении JavaRush.
nickyyy Уровень 1
27 июля 2024
насколько я понимаю , нас в задачас проверяет версия Java, где нельзя писать:

switch(something) {
case 1 -> ...
}
поэтому вот самое лаконичное решение без break

      switch(countOfCorner) {
            case 3: return "Треугольник";
            case 4: return "Четырехугольник";
            case 5: return "Пятиугольник";
            case 6: return "Шестиугольник";
            case 7: return "Семиугольник";
            case 8: return "Восьмиугольник";
            default: return "Другая фигура";
        }
Misery_aripes Уровень 2
8 августа 2024
мой код компилятор принял return switch (countOfCorner){ case 3 -> "Треугольник"; case 4 -> "Четырехугольник"; case 5 -> "Пятиугольник"; case 6 -> "Шестиугольник"; case 7 -> "Семиугольник"; case 8 -> "Восьмиугольник"; default -> "Другая фигура"; };
Anonymous #3450888 Уровень 2
26 июля 2024

Новый синтаксис позволяет писать так:
switch (season) {
    case WINTER -> System.out.println("Зима");
    case SPRING -> System.out.println("Весна");
    // и так далее...
}
Убирает необходимость в `break`
Anton_Diachkov Уровень 18
7 февраля 2025
Компилятор уже заставляет и при обычном написании убирать break;
15 июля 2024
Наведите курсор на if или switch и нажмите Alt+Enter. Там будет replace with... (switch или if).
Denzol255 Уровень 26
12 июля 2024
Ультрадушные задания... Особенно осознавая, что в 99% случае всё равно будешь использовать if else 😀