在Java中切换语句

Raj*_*A C 16 java switch-statement

Java中的switch语句可能有多少种情况?例如,如果我们检查一个整数,可能有多少个案例块?

x4u*_*x4u 14

绑定您将最有可能第一个见面的是,在每类中的常量池是65535.这将允许小型复杂几千块的情况下的最大条目数.常量池包含一个条目,每个数字或字符串文字在类中至少使用一次,但也包含一个或多个条目用于所有字段,方法和/或类引用,因为这些条目是代表必须的其他常量组成的同样存在于常数池中.即方法引用条目包括对方法签名的字符串条目的引用以及对声明类的类条目的引用.类条目本身再次引用类名的字符串条目.

请参阅:Java虚拟机的限制常量池Java虚拟机规范

忽略或重用案例块中的代码的开关的绝对上限略小于2 ^ 30个案例,因为每个案例都有一个跳转目标,这是一个带符号的32位整数(参见tableswitchlookupswitch指令),因此需要4个字节每种情况和每种方法的字节代码大小限制为略小于2 ^ 32字节.这是因为字节代码包含在代码属性中,属性长度是无符号32位整数.由于代码属性具有一些头信息,因此该方法需要一些入口和退出代码,并且tableswitch语句需要一些字节,其最小/最大值和最多3个字节的填充,因此这个大小更小.

  • 您正在通过引用字节码的限制来回答有关Java语言限制的问题,该字节码是明确的_wrong_.有许多Java编译器针对除字节码之外的其他语言.这应该强调这样一个事实[Java规范(http://docs.oracle.com/javase/specs/jls/se7/html/index.html)!= [JVM规范(http://docs.oracle. COM/JavaSE的/规格/ JVM中/ SE7/HTML/index.html的). (2认同)

Boh*_*ian 7

没有限制,除了JVM的大小以容纳所有字节码

  • JVM规范!= java规范.如果jvm强加了Java规范没有的限制,你可以在javac或jvm上提交错误报告 (2认同)

Dzi*_*inX 5

16377。至少对于一个简单的代码,如:

public class SwitchLimit {

    public static void main(String[] args) {
        int x = 0;
        switch(x) {
        case 0:
        ...
        case 16376:
        default:
        }
        System.out.println("done.");
    }

}
Run Code Online (Sandbox Code Playgroud)

在这个例子中你可以有 16377 个 case 语句(不计算default),如果你添加一个case 16377:,代码将不会编译,并出现以下错误:

方法 main(String[]) 的代码超过了 65535 字节的限制

正如其他人指出的那样,如果您的方法实际上做了任何有意义的事情,这个数字可能会显着降低。


Cha*_*har 4

这取决于您的要求。你可以有很多 range int 类型的情况。由于int类型的范围是有限的,因此整数循环的概念就出现了。

由于 int 的大小范围为 -2,147,483,648 到 2,147,483,647,因此每个数字都可以有一个大小写。所以整数的情况是有限的。

但如果你想在 case 中使用 String,那么你可以拥有无​​限数量的 case,正如 Bohemian 所说。