在循环内声明的变量是否在一次迭代中限制了范围?

时间:2015-03-26 13:25:29

标签: java performance loops scope declaration

我知道这听起来微不足道,但我只想清醒一下......

考虑

for (int i = 0; i < 100; i++) {
    int x=i;
    System.println(i);
}

是为每次迭代创建和分配的新内存,或者编译器是否巧妙地推导出场景并仅创建一次并更改其值(因为它知道这是一个循环),

就方法签名中的i声明而言,它显然只创建一次了吗?

也将

int x = 0;

for (int i = 0; i < 100; i++) {
    x = i;
    System.println(i);
}

真的比上面那个效率更高吗?

在java中我不需要在循环之外访问x的情况下,最好将其声明为内部,这是一个好习惯吗?

1 个答案:

答案 0 :(得分:1)

您可以比较两种情况下创建的字节码。

在循环外声明变量:

public static void main(String[] args) {
    int x;
    for (int i = 0; i < 100; i++) {
        x = i;
    }
}

结果:

public static void main(java.lang.String[]);
Code:
   0: iconst_0
   1: istore_2
   2: iload_2
   3: bipush        100
   5: if_icmpge     16
   8: iload_2
   9: istore_1
  10: iinc          2, 1
  13: goto          2
  16: return

在循环中声明变量时:

public static void main(String[] args) {
    for (int i = 0; i < 100; i++) {
        int x = i;
    }
}

给出:

public static void main(java.lang.String[]);
Code:
   0: iconst_0
   1: istore_1
   2: iload_1
   3: bipush        100
   5: if_icmpge     16
   8: iload_1
   9: istore_2
  10: iinc          1, 1
  13: goto          2
  16: return

如您所见,字节码几乎完全相同。唯一的区别是,在第一种情况下,x是变量1而i是变量2,而在第二种情况下,x是2,i是1。关于性能,两个代码都是等价的。

现在,关于设计,在可能的情况下限制变量范围是一种很好的做法。因此,在循环中声明x可能更可取。