【发布时间】:2020-10-17 14:03:46
【问题描述】:
我一直认为 final 关键字在性能方面对局部方法变量或参数没有影响。因此,我尝试测试以下代码,似乎我错了:
private static String doStuffFinal() {
final String a = "A";
final String b = "B";
final int n = 2;
return a + b + n;
}
private static String doStuffNotFinal() {
String a = "A";
String b = "B";
int n = 2;
return a + b + n;
}
我检查了字节码,这两种方法并不相同。在idea中反编译出来的代码是这样的:
private static String doStuffFinal() {
String a = "A";
String b = "B";
int n = 2;
return "AB2";
}
private static String doStuffNotFinal() {
String a = "A";
String b = "B";
int n = 2;
return a + b + n;
}
为什么这两种方法有区别? javac不能优化这样一个小事吗?编译器可以看到 a、b 和 n 在 doStuffNotFinal 中没有变化,并以相同的方式优化代码。为什么不会发生这种情况?
更重要的是,这是否意味着我们最好将 final 关键字放在各处,以确保获得最佳优化?
【问题讨论】:
-
@AndyTurner,是的,在这两种情况下都是如此。生成的字节码虽然不同
标签: java variables methods compiler-construction final