Java的switch语句如何在幕后工作?它如何比较正在使用的变量的值与案例部分中给出的值?它是使用==
还是.equals()
,还是完全不同的其他内容?
我主要对1.7版本的版本感兴趣。
答案 0 :(得分:18)
两者都没有。它使用lookupswitch
JVM指令,它本质上是一个表查找。看一下以下示例的字节码:
public static void main(String... args) {
switch (1) {
case 1:
break;
case 2:
break;
}
}
public static void main(java.lang.String[]);
Code:
Stack=1, Locals=1, Args_size=1
0: iconst_1
1: lookupswitch{ //2
1: 28;
2: 31;
default: 31 }
28: goto 31
31: return
答案 1 :(得分:11)
从this answer可以看出,Java switch
(至少在1.7之前)并不总是汇编为==
或 .equals()
。相反,它使用表查找。虽然这是一个非常小的微优化,但在进行大量的比较时,表查找几乎总是更快。
请注意,这仅用于检查密集密钥的switch
语句。例如,检查枚举值的所有可能性可能会产生这种主要实现(内部称为tableswitch
)。
如果检查更多稀疏填充的密钥集,JVM将使用替代系统,称为lookupswitch
。它将简单地比较各种键和值,基本上对每种可能性进行优化==
比较。为了说明这两种方法,请考虑以下两个switch语句:
switch (value1) {
case 0:
a();
break;
case 1:
b();
break;
case 2:
c();
break;
case 3:
d();
break;
}
switch (value2) {
case 0:
a();
break;
case 35:
b();
break;
case 103:
c();
break;
case 1001:
d();
break;
}
第一个例子很可能会使用表格查找,而另一个例子(基本上)会使用==
比较。
答案 2 :(得分:5)
从here
复制在字节码中有两种形式的开关:tableswitch和lookupswitch。一个假设密集的密钥,另一个密集。请参阅JVM规范中的编译开关说明。对于枚举,找到序号,然后代码继续作为int情况。我不完全确定如何实现JDK7中关于String little功能的建议切换。
但是,大量使用的代码通常在任何合理的JVM中编译。优化者并非完全愚蠢。不要担心,并按照通常的启发式方法进行优化。
您会在here
找到详细的答案答案 3 :(得分:2)
1.Before Java 7
的到来,它是"=="
,因为我们可以使用整数和char作为switch case,因为它们是原始的,所以必须是"=="
。
2。来自Java 7
,字符串也允许用于开关案例,字符串为object
,".equals"
为使用
我想补充一点...... "=="
用于比较 Object Reference
Variable
,不是对象本身{ STRONG>。使用".equals"
我们比较对象。
答案 4 :(得分:1)
如果使用pre 1.7 Java,我认为它使用
==
因为对于int,你不能做例如等于enum,equals和==将返回相同的
修改强>
我的假设是错误的,它使用了一个查找表,在字节码中它想像:
tableswitch
这比通常的if / else快得多,正如其他人指出的那样。
答案 5 :(得分:0)
如果使用原始类型(如整数),则java将使用==
来比较它们如果您使用的是字符串,那么java将使用equals()
方法来测试字符串是否相等。如果您使用带枚举的switch语句,那么==
和equals()
都是相同的,因此使用哪一个并不重要。
答案 6 :(得分:0)
开关使用byte,short,char和int原始数据 类型。它也适用于枚举类型(在枚举类型中讨论), String类,以及一些特定的包装类 原始类型:字符,字节,短整数和整数。 (Java 1.6)
虽然将基元与==
进行比较,但switch
方法肯定会在Java 1.6(及更早版本)中使用这种比较。