6

在 Java 字节码级别,简单的 if 语句(示例 1)和普通的 if 语句(示例 2)之间有什么区别:

示例 1:

if (cond) statement;

示例 2:

if (cond) {
    statement;
}

问题的背景是,我在“高性能”类中看到了java.awt.Rectangle只有Point没有花括号的变体。

是否有任何速度优势,还是只有代码风格?

4

3 回答 3

10

除了代码的可维护性,在性能方面完全一样。你不会从删除中获得加速{},因为{}它不是它自己的指令。

我通常使用 with{}因为使代码易于阅读(IMO)并且不利于出错。

这个例子:

public void A(int i) {
     if (i > 10) {
        System.out.println("i");
        }
    }

    public void B(int i) {
        if (i > 10)
            System.out.println("i");
    }

生成的字节码:

 // Method descriptor #15 (I)V
  // Stack: 2, Locals: 2
  public void A(int i);
     0  iload_1 [i]
     1  bipush 10
     3  if_icmple 14
     6  getstatic java.lang.System.out : java.io.PrintStream [16]
     9  ldc <String "i"> [22]
    11  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]
    14  return
      Line numbers:
        [pc: 0, line: 5]
        [pc: 6, line: 6]
        [pc: 14, line: 8]
      Local variable table:
        [pc: 0, pc: 15] local: this index: 0 type: program.TestClass
        [pc: 0, pc: 15] local: i index: 1 type: int
      Stack map table: number of frames 1
        [pc: 14, same]

  // Method descriptor #15 (I)V
  // Stack: 2, Locals: 2
  public void B(int i);
     0  iload_1 [i]
     1  bipush 10
     3  if_icmple 14
     6  getstatic java.lang.System.out : java.io.PrintStream [16]
     9  ldc <String "i"> [22]
    11  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]
    14  return
      Line numbers:
        [pc: 0, line: 11]
        [pc: 6, line: 12]
        [pc: 14, line: 13]
      Local variable table:
        [pc: 0, pc: 15] local: this index: 0 type: program.TestClass
        [pc: 0, pc: 15] local: i index: 1 type: int
      Stack map table: number of frames 1
        [pc: 14, same]

如您所见,它们是相同的。

于 2013-02-10T20:42:59.477 回答
5

两者完全相同。Java 编译将产生相同的代码。

但是请记住,在非括号情况下,您将无法像在括号情况下那样在 if 块内添加多个子语句

于 2013-02-10T20:22:22.907 回答
2

你给出的两个例子做同样的事情。你的第一个例子是一个简单的 if-then-statement,而你的第二个例子是一个普通的if-then 语句

执行这两个语句所需的时间是相同的,因为大括号不是指令,因此不会影响速度。不过,我仍然会使用普通的 if 语句,因此您可以在 if 语句中包含任意数量的语句。

于 2013-02-10T20:26:23.977 回答