我假設編譯器會爲你的兩種情況產生相同的字節碼。所以,我測試了這兩種不同的源文件:
public class Test1 {
public static void main(String[] args) {
if (args[0].equals("a"))
if (args[1].equals("b"))
System.out.println("Foo");
}
}
和...
public class Test2 {
public static void main(String[] args) {
if (args[0].equals("a") && args[1].equals("b"))
System.out.println("Foo");
}
}
與javap -c Test1
等檢查他們的字節碼,結果是相同的:
public static void main(java.lang.String[]);
Code:
0: aload_0
1: iconst_0
2: aaload
3: ldc #2 // String a
5: invokevirtual #3 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
8: ifeq 30
11: aload_0
12: iconst_1
13: aaload
14: ldc #4 // String b
16: invokevirtual #3 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
19: ifeq 30
22: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
25: ldc #6 // String Foo
27: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
30: return
因此,性能將是相同的。儘管如果有人能想到一個不同字節碼的例子,我歡迎評論。
我的結果來自Java 1.7的Oracle的javac
。結果可能會與其他編譯器不同,但我懷疑它們不適合這種情況。
我不認爲他們是不同的,性能將取決於使用情況。如果在第二種類型之前使用第一種類型,那麼第一種類型需要更多時間,反之亦然。基本上都是一樣的。 – Prashant 2015-03-13 13:27:32
在&&運算符的情況下,如果a通過,則b將不會被評估。它的短路。 – muasif80 2015-03-13 13:28:44
等等...只是爲了檢查。我們在談論運行速度還是編譯速度?你已經使用了諸如「*是否調用空指令......花費**編譯器**一些通知時間」等短語,但我不禁想到你正在討論運行時。 – 2015-03-13 13:50:12