哪种更好的方式在Java / Android中引入变量?

时间:2013-02-23 13:11:30

标签: java android

第一个示例是否会生成更高效的代码 比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
}

3 个答案:

答案 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