java Switch表达式的帮助箭头(>),现在可以产生/返回值
在Java14中的扩展开关表达式中,除了程序员/审阅者的视觉清晰度外,开关表达式的需求尚不清楚。是吗
- 与旧的开关表达式不同的字节码实现李>
- 与以前的版本相比,在执行方面是否有任何性能改进李>
参考:https://www.techgeeknext.com/java/java14-features
JDK 14版本:
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
JDK 14字节代码
0: iconst_1
1: istore_1
2: iload_1
3: tableswitch { // 1 to 7
1: 44
2: 44
3: 44
4: 49
5: 54
6: 54
7: 59
default: 64
}
44: bipush 6
46: goto 65
49: bipush 7
51: goto 65
54: bipush 8
56: goto 65
59: bipush 9
61: goto 65
64: iconst_0
65: istore_2
66: return
JDK-10代码
int numLetters;
int day = 1;
switch (day) {
case 1:
case 2:
case 3:
numLetters = 6;
break;
case 4:
numLetters = 7;
break;
case 5:
case 6:
numLetters = 8;
break;
case 7:
numLetters = 9;
break;
default:
numLetters = 0;
}
JDK-10字节码
0: iconst_1
1: istore_2
2: iload_2
3: tableswitch { // 1 to 7
1: 44
2: 44
3: 44
4: 50
5: 56
6: 56
7: 62
default: 68
}
44: bipush 6
46: istore_1
47: goto 70
50: bipush 7
52: istore_1
53: goto 70
56: bipush 8
58: istore_1
59: goto 70
62: bipush 9
64: istore_1
65: goto 70
68: iconst_0
69: istore_1
70: return
除了块内的本地分配减少了JIT指令之外,基本体没有什么主要区别
# 1 楼答案
就像
switch
overString
一样,字节码没有改变,也没有必要改变虽然字节码是专门为编译Java源代码而设计的,但它并没有受到同样的限制。另见Bytecode features not available in the Java language
switch
表达式利用了一个以前普通Java代码不使用的功能,但肯定会被针对JVM的其他编程语言的自动代码生成器或编译器使用,它可以将值推送到开关情况的不同分支中的操作数堆栈,以便在合并点之后使用。对于好的switch
语句,您必须始终将值存储到局部变量中,并在合并点之后加载它〈普通Java代码没有利用的另一个功能是(ab)使用开关指令生成奇特的循环,只需在开关指令之前设置目标位置,就可以顺利地使用Java字节码。谁知道在未来的语言版本中是否会有一些源代码特性利用这些特性…〉
但是否使用中间局部变量,应该无关紧要。优化器将代码转换为SSA form后,即使在应用其他代码转换和优化之前,也会消除局部变量和操作数堆栈之间的所有传输
这并不排除特定实现(版本)中对开关指令的细微更改所导致的surprising performance differences