第一个示例是否会生成更高效的代码 比Java / Android中的第二个和一般的Java中的第二个?
至少第一个例子不能比第二个慢, 我想..
我不在乎这里变量v可能会在第一时间内存活更长时间 例如,可能会长时间记忆。
当然,第二种做法更具可读性 如果你有更复杂的代码与几个内部块。 这也不是问题所在。
MyType v;
for(int i=0;i<bigCount;++i)
{
v = <value produced for i>;
//do something with v
}
for(int i=0;i<bigCount;++i)
{
MyType v = <value produced for i>;
//do something with v
}
答案 0 :(得分:2)
我会选择第二个选项,因为v
变量范围在for
循环内。它不需要在任何地方使用。
这样,创建并分配给v
的对象就可以提前进行垃圾回收。或者至少最后一个比第一段代码更快。
答案 1 :(得分:1)
我创建了一个最小的例子:
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
我的猜测是,如果编译器看到,循环之前创建的变量从不在循环之后使用,它只是将它的定义拉入循环。所以在你的情况下,两者都不是更有效率。因此,请使用更具可读性的{({1}})。
答案 2 :(得分:0)
为防止多次分配,您可以在其自己的范围内关闭变量,如下所示:
{
MyType v;
for(int i=0;i<bigCount;++i)
{
v = <value produced for i>;
//do something with v
}
}
此块后v
将收集 GC