Как сказано здесь , коммутатор работает с примитивными типами байтов, коротких символов, символов типа char и int. Он также работает с перечисляемыми типами и несколькими специальными классами, которые «оборачивают» определенные примитивные типы: Character, Byte, Short и Integer.
Оператор переключения Java компилируется в табличный переключатель байт-кода JVM или переключатель поиска . Оба эти байт-кода требуют, чтобы значения регистра были уникальными, 32-разрядными, целочисленными, константами времени компиляции.
Инструкции tablewitch и lookupswitch включают одно смещение ветви по умолчанию и набор пар длины значение / смещение переменной переменной длины.
Обе инструкции извлекают ключ (значение выражения в скобках, следующее сразу за ключевым словом switch) из стека.
Ключ сравнивается со всеми значениями регистра:
- Если совпадение найдено, берется смещение ветви, связанное со значением регистра.
- Если совпадений не найдено, берется смещение по умолчанию.
Несмотря на то, что приведенное выше представляет детали реализации, я считаю, типы, используемые для коммутатора, совместимы с эффективным байт-кодом для потока управления , и, возможно, это была важная часть по причине этого выбора .
Как сказано в этом Java Bug :
Полагаю, вы могли бы позволить случаям оператора Java switch включать другие типы значений и скомпилировать оператор switch, который использует один из этих типов значений, в другой байт-код, такой как последовательность ifs и gotos. Но тогда нам нужно тщательно изучить все операторы switch, чтобы определить, будет ли он скомпилирован в байт-код быстрого переключения или в медленную последовательность if-elses.
Как сказано в этом другом Java ошибка
операторы 'switch' могут использовать диспетчеризацию таблицы функций и / или поиск в двоичном дереве, чтобы быстрее сопоставлять операторы case, чем просто проверять их по порядку.