在Java中切换语句
Java中的switch语句可能有多少种情况? 例如,如果我们检查一个整数,可能有多少个案例块?
您最有可能首先遇到的绑定是每个类的常量池中的最大条目数(65535)。这将允许几千个小复杂的情况块。 常量池包含一个条目,每个数字或字符串文字在类中至少使用一次,但也包含一个或多个条目用于所有字段,方法和/或类引用,因为这些条目是代表必须的其他常量组成的。也存在于常数池中。 即方法引用条目包括对方法签名的字符串条目的引用以及对声明类的类条目的引用。 类条目本身再次引用类名的字符串条目。
请参阅: Java虚拟机规范 中的Java虚拟机和常量池的 限制
忽略或重用案例块中的代码的开关的绝对上限略小于2 ^ 30个案例,因为每个案例都有一个跳转目标,这是一个带符号的32位整数(参见tableswitch和lookupswitch指令),因此需要4个字节每种情况和每种方法的字节代码大小限制为略小于2 ^ 32字节。 这是因为字节代码包含在代码属性中 , 属性的长度是无符号的32位整数。 由于代码属性具有一些头信息,因此该方法需要一些入口和退出代码,并且tableswitch语句需要一些字节,其最小/最大值和最多3个字节的填充,因此减小了这个大小。
没有限制,除了JVM的大小以容纳所有字节码
这取决于您的要求。 你可以有很多范围int类型的情况。 由于int类型的范围是有限的,因此整数周期的概念将进入图像。
由于int的大小范围从-2,147,483,648到2,147,483,647,因此您可以为每个数量设置一个大小写。 因此在整数的情况下存在有限数量的情况。
但是如果你想使用String,那么你可以拥有波希米亚人所说的无限数量的案例。
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字节的限制
正如其他人指出的那样,如果您的方法实际上做了任何有意义的事情,这个数字可能会显着降低。
案例总数将是int可以采取的最大数量,具体取决于硬件。 看看java中的数据类型
因此,您将拥有尽可能多的案例块的整个范围。
交换机中的case语句没有限制。 在最坏的情况下,你可以获得堆空间,但不是很容易。
阅读问题,答案和评论,我不明白为什么它是相关的。 你可以拥有比手动编写的更多case
。 而且,在机器生成代码的不可能的情况下,有比Java中的switch
es更好的选择。
Infinite!!
没有这样的限制。