短路与多个if

Aeq*_*tas 4 java optimization if-statement short-circuiting

这有什么区别:

if(a && b)
{
     //code
}
Run Code Online (Sandbox Code Playgroud)

还有这个:

if(a)
{
     if(b)
     {
          //code
     }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,b只有在第一个代码块中才会得到评估,如果a为真,那么第二个代码块就是同一个东西.

使用一个优于另一个有什么好处吗?代码执行时间?记忆?等等

Anu*_*oob 8

它们被编译为相同的字节码.没有性能差异.

可读性是唯一的区别.作为一个巨大的概括,短路看起来更好,但嵌套稍微清晰.它真的归结为具体的用例.我通常会短路.


我试过这个.这是代码:

public class Test {

    public static void main(String[] args) {
        boolean a = 1>0;
        boolean b = 0>1;

        if (a && b)
            System.out.println(5);

        if (a)
            if (b)
                System.out.println(5);
    }
}
Run Code Online (Sandbox Code Playgroud)

这编译为:

  0: iconst_1
  1: istore_1
  2: iconst_0
  3: istore_2
  4: iload_1
  5: ifeq          19
  8: iload_2
  9: ifeq          19
 12: getstatic     #2
 15: iconst_5
 16: invokevirtual #3
 19: iload_1
 20: ifeq          34
 23: iload_2
 24: ifeq          34
 27: getstatic     #2
 30: iconst_5
 31: invokevirtual #3
 34: return
Run Code Online (Sandbox Code Playgroud)

注意这个块如何重复两次:

  4: iload_1
  5: ifeq          19
  8: iload_2
  9: ifeq          19
 12: getstatic     #2
 15: iconst_5
 16: invokevirtual #3
Run Code Online (Sandbox Code Playgroud)

两次都是相同的字节码.