我创建了一个最小的例子:
public void option1() {
String s;
for (int i = 0; i < foo; i++) {
s = String.valueOf(i);
}
}
public void option2() {
for (int i = 0; i < foo; i++) {
String s = String.valueOf(i);
}
}
并发现生成的字节码对于两者都是相同的:
option1()
:
0 iconst_0
1 istore_2
2 goto 13 (+11)
5 iload_2
6 invokestatic #17 <java/lang/String/valueOf(I)Ljava/lang/String;>
9 astore_1
10 iinc 2 by 1
13 iload_2
14 aload_0
15 getfield #23 <MethodTest/foo I>
18 if_icmplt 5 (-13)
21 return
option2()
:
0 iconst_0
1 istore_1
2 goto 13 (+11)
5 iload_1
6 invokestatic #17 <java/lang/String/valueOf(I)Ljava/lang/String;>
9 astore_2
10 iinc 1 by 1
13 iload_1
14 aload_0
15 getfield #23 <MethodTest/foo I>
18 if_icmplt 5 (-13)
21 return
我的猜测是,如果编译器看到,在循环之前创建的变量永远不会在循环之后使用,它只是将它的定义拉到循环中。所以在你的情况下,两者都不是更有效的。所以选择更易读的(option2()
)。