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

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

Открыта

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, 21:40
Странный уровень... Вываливают кучу информации о коллекциях, причём она важная и нужная, но основательно мы затронем ту, которую 20 лет не используют. Про неё обязательно спросят на собеседовании? Хорошо, но сейчас мне эта информация зачем нужна, я вроде как учусь... И в конце такие - "О! А мы рассказывали вам про аналог if/else?" Ктоооо это структурировал? Такое чувство, что я в случайном порядке темы прохожу.
17 апреля 2025, 17:12
Написал сразу коде case оператор return, а после успешной проверки задачи, Idea подсказала более лаконичное решение через еще не пройденный return switch:
return switch (countOfCorner) {
    case 3 -> "Треугольник";
    case 4 -> "Четырехугольник";
    case 5 -> "Пятиугольник";
    case 6 -> "Шестиугольник";
    case 7 -> "Семиугольник";
    case 8 -> "Восьмиугольник";
    default -> "Другая фигура";
};
Mikhail Savostin QA Automation Engineer
5 апреля 2025, 13:20
String shape = switch (countOfCorner) { case 3 -> "Треугольник"; case 4 -> "Четырехугольник"; case 5 -> "Пятиугольник"; case 6 -> "Шестиугольник"; case 7 -> "Семиугольник"; case 8 -> "Восьмиугольник"; default -> "Другая фигура"; }; return shape; } }
ShadyLine
Уровень 38
18 марта 2025, 08:58
Крутой и несложный урок! Весьма полезный и полагаю часто используемый оператор!
AndreyRjr
Уровень 25
17 февраля 2025, 18:48
На последней задаче в плагине в IntelliJ IDEA не отображаются условия
Anton ZhukovДурачок в Сбер
5 марта 2025, 22:34
У меня нормально отображается
Юлия
Уровень 66
21 августа 2024, 13:17
а видео внутри курса теперь только с vpn можно посмотреть?
Duxa552
Уровень 1
21 августа 2024, 15:02
тем, кто из рф, то да...
Antariko
Уровень 1
20 сентября 2024, 09:12
Прекрасно всё открывается и без впн.
Сергей Лаптев
Уровень 36
12 октября 2024, 10:11
Ну или с мобильного интернета, открыть последнее задание в приложении JavaRush.
nickyyy
Уровень 1
27 июля 2024, 15:09
насколько я понимаю , нас в задачас проверяет версия 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, 07:10
мой код компилятор принял return switch (countOfCorner){ case 3 -> "Треугольник"; case 4 -> "Четырехугольник"; case 5 -> "Пятиугольник"; case 6 -> "Шестиугольник"; case 7 -> "Семиугольник"; case 8 -> "Восьмиугольник"; default -> "Другая фигура"; };
Anonymous #3450888
Уровень 2
26 июля 2024, 07:09
Новый синтаксис позволяет писать так:
switch (season) {
    case WINTER -> System.out.println("Зима");
    case SPRING -> System.out.println("Весна");
    // и так далее...
}
Убирает необходимость в `break`
Anton_Diachkov
Уровень 18
7 февраля 2025, 06:41
Компилятор уже заставляет и при обычном написании убирать break;
Илюха Будущий ЮниорJava - стажёр в ASTON
15 июля 2024, 05:19
Наведите курсор на if или switch и нажмите Alt+Enter. Там будет replace with... (switch или if).
Denzol255Frontend Developer в Sber
12 июля 2024, 12:48
Ультрадушные задания... Особенно осознавая, что в 99% случае всё равно будешь использовать if else 😀