我知道这听起来微不足道,但我只想清醒一下......
考虑
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
的情况下,最好将其声明为内部,这是一个好习惯吗?
答案 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
可能更可取。