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