Оператор Switch или if \ else

195
15 февраля 2018, 15:03

Есть ли какие-то преимущества у switch над конструкцией (if else + else if) помимо визуальной наглядности

Answer 1

Простой пример:

switch(a) {
  case 1:
    operation1();
  case 2:
    operation2();
    break;
...
}

В случае "1" будут выполнены функции operation1 и operation2, в случае "2" - только operation2. PS: можно это описать и с помощью if else, но зачем.

Answer 2

Помимо визуальных отличий из самых крутых могу рассказать про группу кейсов.

Допустим, у вас есть год (неважно откуда) и необходимо в зависимости от него делать разные вещи. К примеру, сделать одно и то же если год 1987 1900 1791

Как это выглядит в if/else

if (year == 1987 || year == 1900 || year == 1791) {}

В switch

switch (year) {
    case ....... 
    case 1987:
    case 1790:
    case 1791:
        //что-то там..
        break;
    case ........
}

Ну а вообще лучше всех - котлиновский when - switch на стероидах)

Answer 3

Если посмотреть с точки производительности, то конструкция switch может быть скомпилирована в два варианта байткода с использованием:

  1. TableSwitch - если варианты в операторах case не большие (не разрежены), то компилятор создаст массив с адресами на метки перехода.
  2. LookupSwitch - если варианты разрежены, то будет создана некая ассоциативная таблица с значениями и метками перехода.

Из этого можно сделать вывод, что когда значения не сильно разрежены и имеют не большой диапазон, то оператор switch будет работать в разы быстрее, чем if..else, но и памяти будет потреблять больше.

READ ALSO
Изменение части текста

Изменение части текста

Как можно изменить часть текста? Не понимаю как можно этого добитьсяЯ думал разбить на массив char и менять эти символы

141
Возврат массива из функции в обратном порядке

Возврат массива из функции в обратном порядке

Задача: отправить в функицию массив и вернуть (не отобразить,а именно вернуть) массив в обратном порядкеРезультат: Вылазит ексепшн согласно...

168
Деплой Spring Boot/PostgreSQL проекта через Gradle и Docker

Деплой Spring Boot/PostgreSQL проекта через Gradle и Docker

ЗдравствуйтеВозникла проблема с деплоем, над которой я уже бьюсь больше суток

185
java. Hibernate. transactionManager

java. Hibernate. transactionManager

Не могу настроить transactionManager

163