可能重复:
您在哪里声明变量?方法的顶部或何时需要它们?
如果我在Java循环内或循环外声明变量,会有所不同吗?
这是
for(int i = 0; i < 1000; i++) {
int temp = doSomething();
someMethod(temp);
}
等于这个(关于内存使用)?
int temp = 0;
for(int i = 0; i < 1000; i++) {
temp = doSomething();
someMethod(temp);
}
如果临时变量例如是ArrayList,该怎么办?
for(int i = 0; i < 1000; i++) {
ArrayList<Integer> array = new ArrayList<Integer>();
fillArray(array);
// do something with the array
}
编辑:随着javap -c
我得到以下输出
循环外的变量:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iconst_0
3: istore_2
4: iload_2
5: sipush 1000
8: if_icmpge 25
11: invokestatic #2 // Method doSomething:()I
14: istore_1
15: iload_1
16: invokestatic #3 // Method someMethod:(I)V
19: iinc 2, 1
22: goto 4
25: return
循环内的变量:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: sipush 1000
6: if_icmpge 23
9: invokestatic #2 // Method doSomething:()I
12: istore_2
13: iload_2
14: invokestatic #3 // Method someMethod:(I)V
17: iinc 1, 1
20: goto 2
23: return
对于感兴趣的人,此代码:
public class Test3 {
public static void main(String[] args) {
for(int i = 0; i< 1000; i++) {
someMethod(doSomething());
}
}
private static int doSomething() {
return 1;
}
private static void someMethod(int temp) {
temp++;
}
}
产生这个:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: sipush 1000
6: if_icmpge 21
9: invokestatic #2 // Method doSomething:()I
12: invokestatic #3 // Method someMethod:(I)V
15: iinc 1, 1
18: goto 2
21: return
但是优化会在运行时进行。有没有办法查看优化的代码?(很抱歉编辑很久)
1
我很高兴您真正查看了反汇编,并希望它对您有所帮助。我曾希望有实际Java经验的人回答您有关优化代码的最后一个问题,但是也许您可以在Stackoverflow上发布该特定部分-这似乎是一个非常具体的问题。
—
Joris Timmermans 2012年
是的,我将尝试获取优化的代码。(问题有所改变,我在编辑中用优化的代码问了这个问题)
—
Puckl 2012年
重复链接断开。现在是使这个问题成为原创的时候了。
—
Zon