Оператор switch в Java
Сколько случаев возможно для оператора switch в Java? Например, если мы проверяем целое число, сколько блоков блоков возможно?
Ответы
Ответ 1
Скорее всего, вы сначала встретитесь с максимальным количеством записей в пуле констант в классе, равном 65535. Это позволит создать несколько тысяч блоков кода небольшой сложности. Константный пул содержит одну запись для каждого числового или строкового литерала, который используется хотя бы один раз в классе, но также один или несколько записей для всех ссылок на поле, метод и/или класс, поскольку эти записи составлены от имени других констант, которые должны быть присутствующих в постоянном пуле. То есть эталонная запись метода состоит из ссылки на запись строки для сигнатуры метода и ссылки на запись класса класса объявления. Сама запись класса снова ссылается на строковую запись для имени класса.
Смотрите: Ограничения виртуальной машины Java и Постоянный пул в Спецификация виртуальной машины Java
Абсолютная верхняя граница для переключателя, игнорирующего или повторно использующего код в блоках case, немного меньше, чем 2 ^ 30 случаев, поскольку каждый случай имеет цель перехода, которая является 32-битным целым числом (см. tableswitch и lookupswitch), и поэтому для каждого случая требуется 4 байта, а размер байтового кода для каждого метода ограничен немного меньше чем 2 ^ 32 байта. Это связано с тем, что байтовый код завернут в атрибут , а длина атрибута указана как беззнаковое 32-битное целое число. Этот размер уменьшен, потому что атрибут кода имеет некоторую информацию заголовка, для этого нужен некоторый код ввода и выхода, а для инструкции tablewitch нужны некоторые байты для себя со значениями min/max и не более 3 байтов заполнения.
Ответ 2
Нет ограничений, кроме размера вашей JVM, чтобы разместить все байт-коды
Ответ 3
Это зависит от вашего требования. у вас может быть много случаев диапазона int type. Поскольку диапазон типа int конечен, и после этого в картину войдет понятие целочисленного цикла.
Поскольку размер int варьируется от -2,147,483,648 до 2,147,483,647, так что вы можете иметь случай для каждого из них. Таким образом, существует ограниченное число случаев в случае целого числа.
Но если вы хотите использовать String в случае, то вы можете иметь неограниченное количество случаев, как сказано в Bohemian.
Ответ 4
16377. По крайней мере, для простого кода, например:
public class SwitchLimit {
public static void main(String[] args) {
int x = 0;
switch(x) {
case 0:
...
case 16376:
default:
}
System.out.println("done.");
}
}
В этом примере вы можете иметь 16377 операторов case (не считая default
), и если вы добавите case 16377:
, код не будет компилироваться со следующей ошибкой:
Код метода main (String []) превышает предел 65535 байтов
Как указывали другие, это число, вероятно, будет значительно ниже, если ваш метод действительно делает что-либо, что имеет смысл.
Ответ 5
Общее число случаев будет максимальным числом, которое int может принимать в зависимости от аппаратного обеспечения. Посмотрите типы данных в java
Таким образом, у вас будет весь диапазон как возможное количество блоков case.
Ответ 6
Нет ограничений для операторов case в коммутаторе. В худшем случае вы можете получить кучу пространства, но не легко.
Ответ 7
Читая вопрос, ответы и комментарии, я не понимаю, почему это актуально. У вас может быть больше case
, чем вы можете писать вручную. И в невероятном случае, когда вы генерируете свой код машинным способом, в Java есть лучший выбор, чем switch
es.
Ответ 8
Infinite!!
Нет такого ограничения.