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

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

Java Syntax Zero
Рівень 14 , Лекція 7
Відкрита

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 та 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;
}

Примітка. Якщо в операторі switch використовується перелік enum, у case можна не писати ім'я класу перед кожним значенням. Досить просто вказати значення.


Коментарі (9)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
RMykola Рівень 20
4 березня 2025
Ось ця лекція дала мені зрозуміти, що в майбутньому я буду більш прихильним до switch, ніж до enum 😁
IronMan57 Рівень 28
25 січня 2025
В тексті лекції є слідуючий фрагмент: "Примітка. Якщо в операторі switch використовується перелік enum, у case можна не писати ім'я класу перед кожним значенням. Досить просто вказати значення." Схоже, цей текст потрібно дещо змінити - замість "у case можна не писати..." замінити на "у case не можна писати..." Принаймні, коли в IntelliJ IDEA з JDK 17 я спробував після case вказати значення Day.MONDAY, при компіляції отримував помилку з текстом "java: an enum switch case label must be the unqualified name of an enumeration constant". Змінив після case Day.MONDAY на просто MONDAY, і все запрацювало.
Christopher Ward 595 Рівень 16
13 серпня 2024
if (ua.equalsIgnoreCase("понеділок")) не валідується чогось 😥
Natalya Рівень 19
9 листопада 2024
Бо порівнювати потрібно не з ua, а з ua.toLowerCase()
13 березня 2024
Много почерпнул из этой статьи (ранее в задачах пользовался "стрелками"): https://javarush.com/groups/posts/operator-switch-v-java А еще подобной записью: String result = switch (ternaryBool) { case -> { //некоторые вычислительные операции... break 12; } Вот только return нельзя использовать, если есть присвоение значения переменной (в условии).
Sava_crosava Рівень 23
22 жовтня 2023
Стаття чудова! Але дивно поставити 3 задачу після теми про те, що різні типи даних можна використовувати як параметр оператора switch. Краще б було зробити реверсну задачу, де як параметр передається назва фігури а я маю повернути кількість кутів)
Ihor Prokudin Рівень 51
23 березня 2023
в Intelj є така цікава штука...
Elder_HD Рівень 42 Expert
25 травня 2023
О, дякую) Intelij IDEA ще й пропонує цікавіший, зрозуміліший і менш громіздкий запис оператора switch (за допомогою лямбда виразу)
Roma Chernesh Рівень 16
15 лютого 2023
Тема подано зрозуміло. Від мене подяка!