我假设编译器会为你的两种情况产生相同的字节码。所以,我测试了这两种不同的源文件:
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