<分区>
从 Java 1.7 开始,字符串可以与 switch 语句一起使用,这让我想知道一些事情。整数值的 switch
语句被转换为跳转表,这比简单地对运行时计算的整数进行 if
检查更快;可以对字符串进行类似的优化吗?还是这只是语法糖?
<分区>
从 Java 1.7 开始,字符串可以与 switch 语句一起使用,这让我想知道一些事情。整数值的 switch
语句被转换为跳转表,这比简单地对运行时计算的整数进行 if
检查更快;可以对字符串进行类似的优化吗?还是这只是语法糖?
最佳答案
编译器使用hashCode()
方法根据字符串值优化switch
语句,然后在字节码中使用查找表。这通常比 if
-else
语句更有效。
例如,以下内容:
String string = "x";
switch(string) {
case "x": System.out.println("x");
break;
case "y": System.out.println("y");
break;
case "z": System.out.println("z");
break;
}
转换成这个字节码:
ldc "x"
astore_1
aload_1
astore_2
iconst_m1
istore_3
aload_2
invokevirtual java/lang/String/hashCode()I
tableswitch 120
10
17
24
default: 30
aload_2
ldc "x"
invokevirtual java/lang/String/equals(Ljava/lang/Object;)Z
ifeq 30
iconst_0
istore_3
goto 30
aload_2
ldc "y"
invokevirtual java/lang/String/equals(Ljava/lang/Object;)Z
ifeq 30
iconst_1
istore_3
goto 30
aload_2
ldc "z"
invokevirtual java/lang/String/equals(Ljava/lang/Object;)Z
ifeq 30
iconst_2
istore_3
iload_3
tableswitch 0
32
36
40
default: 43
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "x"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
goto 43
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "y"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
goto 43
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "z"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
return
关于java - 带字符串的 switch 不仅仅是语法糖吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29721701/