JavaRush /Курсы /Java Multithreading /switch, case, default

switch, case, default

Java Multithreading
8 уровень , 1 лекция
Открыта
switch, case, default - 1

— Привет, Амиго!

— Привет, Билаабо! Так рад тебя снова видеть. Только твои лекции такие хорошие и понятные. Не то, что эта Java Memory Model.

— Да, Билаабо умеет выбирать лекции. Сегодня я расскажу тебе про switch.

— Так мне уже про него рассказывали, кажется.

— Элли. Амиго не хочет слушать лекцию про switch? Может, начнешь свою?

— Хочу, хочу. Давай про switch.

— Ок. В Java есть такой оператор — Java switch. Он удобен, когда тебе нужно выполнить определенные действия в зависимости от различных значений некоторой переменной.

Пример со switch Аналогичный код
int i = 5;
switch(i)
{
 case 1: 
  System.out.println("один"); 
  break;
 case 2: 
  System.out.println("два"); 
  break;
 case 3: 
  System.out.println("три"); 
  break;
 default: 
  System.out.println("много");
}
int i = 5;
if (i==1)
{
 System.out.println("один");
}
else if (i==2)
{
 System.out.println("два");
}
else if (i==3)
{
 System.out.println("три");
}
else 
{
 System.out.println("много");
}

Оператор switch позволяет прыгнуть на нужный кусок кода, если значение переданной в него переменной совпадает со значением, указанным после слова case.

Если i равно 1, то выполнение перейдет на строку помеченную «case 1».

Если i равно 2, то выполнение перейдет на строку помеченную «case 2».

Если i равно 3, то выполнение перейдет на строку помеченную «case 3».

Если переход не выполнился на какой-либо из case’ов, то выполняется на блок, помеченный «default:»

— Ясно. А справа – это та же самая логика, но реализованная с помощью if-ов?

— Ага.

— А что это еще за слово break? Ты же говорил, что его можно использовать только в циклах?

— Да, можно и здесь. При выполнении команды break мы тут же выходим из switch.

Но если команду break убрать, то все строки внутри switch’а будут выполняться до конца.

Пример Вывод, если i=1 Вывод, если i=2
switch(i)
{
 case 1: 
  System.out.println("один"); 
 case 2: 
  System.out.println("два"); 
 case 3: 
  System.out.println("три");
 default: 
  System.out.println("много"); }
один
два
три
много
два
три
много

Фактически, case – это метки в коде, и в switch мы прыгаем на очередную метку и… начинаем исполнять весь код до конца switch’а, или пока не встретим break.

— Т.е. если мы не напишем break, то сначала выполнится строчка, на которую мы перепрыгнули, а потом все остальные до закрывающей фигурной скобки «}». Так?

— Да.

— Ничего сложного. Но мне больше нравится с использованием if-ов. Там нет этих бессмысленных break.

— Очень часто if действительно компактнее. Но иногда switch более читабельный.

Сравни:

Пример со switch Аналогичный код
public String getName(int i)
{
 switch(i)
 {
  case 1: 
   return "один";
  case 2: 
   return "два";
  case 3: 
   return "три";
  default: 
   return "много";
}
public String getName(int i)
{
 if (i==1)
  return "один";

 if (i==2)
  return "два";

 if (i==3)
  return "три";

return "много"
}

— Не сказал бы, что читабельней.

— Ладно, а как насчет такого примера?

Пример со switch Аналогичный код
public String getName(int i)
{
 switch(i)
 {
  case 1: 
  case 2: 
   return "один или два";
  case 3: 
  case 4: 
  case 5: 
   return "от трех до пяти";
  default: 
   return "много";
}
public String getName(int i)
{
 if (i==1 || i==2)
  return "один или два";

 if (i==3 || i==4 || i==5)
  return "от трех до пяти";

return "много"
}

— Что-то Билаабо у тебя не очень-то и выходит. Так break можно не писать, когда return?

— Ага. return сразу приведет к выходу из метода.

— Что-то все время c if-ами выходит компактнее. Но с switch в этот раз вышло читабельней.

— Фух, наконец-то.

Еще одна вещь. Можно не писать default в конце. Тогда просто ничего не произойдет, если ни одна из меток не совпадет.

— Ну, точно, как if-else… но читабельней, гораздо читабельней!

— Отлично. Рад, что тебе понравилась моя лекция.

Чуть не забыл. Изначально внутри switch можно было использовать переменные только примитивных типов и enum’ы. Но теперь туда добавили и поддержку типа String.

— Т.е. я могу написать так:

Пример
public int getNumber(String number)
{
 switch(number)
 {
  case "one": 
   return 1;
  case "two": 
   return 2;
  case "three": 
   return 3;
  default: 
   return -1;
 }
}

— Ага. Правда, удобно?

— Да. Отличная штука switch!

Комментарии (85)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
I'll kick them all Уровень 5
27 августа 2025
чет сложна. Что дальше? System.out?
SomeBody098 Уровень 51
10 августа 2024
Filand Gor Уровень 34
22 мая 2024
день сурка, а enum забыли
Sergey Уровень 51
13 марта 2024
После архиватора сразу switch? Не рановато ли?
Oleh Velychko Уровень 47 Expert
3 июля 2024
😁
5 марта 2024
ух ты, как интересно
Dmitry Armarchuk Уровень 1
11 января 2024
выдавливание черной матери?
Dmitriy Уровень 41
7 августа 2023
Достаточно было добавить информацию по новым фишка в java 12,13. Уверен, что тогда никто бы плохого слова не сказал.
Taurnil Уровень 51
3 июня 2023
Шел 39 уровень, мы освитчались как могли)
hint1k Уровень 51
13 апреля 2023
- А давайте в блоке про Multithreading расскажем про примитивный оператор, который все должны были выучить 35-40 уровней назад в блоке Syntax? - давайте, надо же учеников занять чем нибудь бесполезным. - хм, а какой у нас вообще метод обучения? - а он состоит из трех приемов: 1) Объясняем то, что ученики уже давно знают 2) Не объясняем ничего, пусть сами гуглят 3) Объясняем в лекции одну тему, а задачу даем на другую тему. - ух ты, да у нас самая классная методика преподавания, да? - ну судя по комментам от учеников, нас хают и ругают все подряд, но мы ничего исправлять не будем, зачем нам еще усилия тратить.
Denis Rogov Уровень 1 Expert
7 марта 2023
Мы сделаем лекцию по целому switch'y (это хорошо, но ложка дорога к обеду), но что такое фьючер таски, фьютчеры, скедьюалы, локи, циклБарьеры - "загуглите, это такая методиГа обучения". Не перестану повторять, первые 20 уровней java syntax - это был наилучший материал по подаче. Да, там был несложный материал, но подавался он хорошо. Дальше что то пошло не так, а после core'a - всё вообще пошло через ж*пу