在诸如下面的java片段中的那个情况下,使用else块来包围返回false与使用else块之后的更快或更好的做法是更快还是更好?
public boolean test(boolean var){
if (var == true){
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
相比
public boolean test(boolean var){
if (var == true){
return true;
}else{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
显然这是一个非常简单的例子,可以缩短为一行,但我的问题是是否有一个jvm优化使得在第二个片段中使用else块更有效,或者是否更好的练习,因为两个片段在逻辑上都是当量.到目前为止,我一直在使用第一个代码段,因为代码少了一点.
Chr*_*lan 13
我编译了两个示例,结果字节码相同:
public boolean test(boolean var);
0 iload_1 [var]
1 ifeq 6
4 iconst_1
5 ireturn
6 iconst_0
7 ireturn
Line numbers:
[pc: 0, line: 5]
[pc: 4, line: 6]
[pc: 6, line: 8]
Local variable table:
[pc: 0, pc: 8] local: this index: 0 type: scratch.Else1
[pc: 0, pc: 8] local: var index: 1 type: boolean
public boolean test(boolean var);
0 iload_1 [var]
1 ifeq 6
4 iconst_1
5 ireturn
6 iconst_0
7 ireturn
Line numbers:
[pc: 0, line: 5]
[pc: 4, line: 6]
[pc: 6, line: 8]
Local variable table:
[pc: 0, pc: 8] local: this index: 0 type: scratch.Else2
[pc: 0, pc: 8] local: var index: 1 type: boolean
Run Code Online (Sandbox Code Playgroud)
至于你应该使用哪一个?在这个人为的例子中,答案是响亮的.与行为匹配的最佳代码是:
public boolean test(boolean var){
return var;
}
Run Code Online (Sandbox Code Playgroud)
鉴于"if {return} else {return}"与"if {return} return"的选择,我的答案通常是后者,因为我更喜欢缩进.但我认为这实际上取决于每个分支中的代码数量.更多其他代码指向后者,如果代码指向前者则更多.
它们完全一样.像这个现代编译器这样的小东西会为你优化,javac就是这样做的.考虑以下课程:
public class IsElseFaster {
public boolean test1(boolean var) {
if (var == true) {
return true;
}
return false;
}
public boolean test2(boolean var) {
if (var == true) {
return true;
} else {
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
复制并粘贴到您喜欢的编辑器中,编译javac.然后运行javap -c IsElseFaster
您将获得以下输出:
public boolean test1(boolean);
Code:
0: iload_1
1: iconst_1
2: if_icmpne 7
5: iconst_1
6: ireturn
7: iconst_0
8: ireturn
public boolean test2(boolean);
Code:
0: iload_1
1: iconst_1
2: if_icmpne 7
5: iconst_1
6: ireturn
7: iconst_0
8: ireturn
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样,到达.class文件时,方法完全相同.