我知道这听起来微不足道,但我只想理清头绪..
考虑
for (int i = 0; i < 100; i++) {
int x=i;
System.println(i);
}
是为每次迭代创建和分配内存的新 int 还是编译器巧妙地推断场景并仅创建一次并更改其值(因为它知道这是一个循环),
就方法签名中的i
声明而言,它显然只创建一次对吧?
也会
int x = 0;
for (int i = 0; i < 100; i++) {
x = i;
System.println(i);
}
真的比上面那个更有效率吗?
在 java 中,如果我不需要在循环外访问 x
,是否最好在循环内声明它,这是一个好的做法吗?
最佳答案
您可以比较两种情况下创建的字节码。
在循环外声明变量:
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
可能更可取。
关于java - 循环内声明的变量是否受单次迭代的范围限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29279646/