Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java/Android中引入变量的更好方法是什么?_Java_Android - Fatal编程技术网

在Java/Android中引入变量的更好方法是什么?

在Java/Android中引入变量的更好方法是什么?,java,android,Java,Android,第一个示例是否生成更高效的代码 在Java/Android和Java中的排名第二 至少第一个例子不能比第二个慢, 我想 在这里,我不关心变量v在第一个变量中的生存时间是否更长 例如,也许长时间地消耗记忆 当然,第二种方法确实更具可读性 如果您有多个内部块的更复杂的代码。 这也不是这里的问题 MyType v; for(int i=0;i<bigCount;++i) { v = <value produced for i>; //do something with v }

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

对于(int i=0;i我会选择第二个选项,因为
v
变量范围在
for
循环中。它不需要在循环之外的任何地方使用


这样,创建并分配给
v
的对象可以更早地进行垃圾收集。或者至少最后一个对象可以比第一段代码更快地进行垃圾收集。

要防止多次分配,可以在其自身范围内关闭变量,如下所示:

{
  MyType v;
  for(int i=0;i<bigCount;++i)
  {
    v = <value produced for i>;
    //do something with v
  }
}
{
MyV型;

对于(int i=0;i我创建了一个最小的示例:

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);
    }
}

选项2()

0 iconst\u 0
1史努比1
2转到13(+11)
5伊洛德1
6.房地产#17
9 astore_2
10 iinc 1乘1
13伊洛德1
14 aload_0
15格特菲尔德#23
18如果icmplt 5(-13)
21返回

我的猜测是,如果编译器看到,在循环之前创建的变量永远不会在循环之后使用,它只是将其定义拉入循环中。因此,在您的情况下,两者都不是更有效的。所以选择一个更可读的(
option2()
).

也许您可以检查它,尝试测量两个循环的运行时间和内存使用情况编写最干净的代码(即第二个)。大多数情况下,最干净的代码意味着更快的代码。在这种情况下,我的猜测是,这是一个不会产生任何重大影响的微优化。我从来没有说过在第一种情况下,它不符合GC。我只是说在第一种情况下,它符合更早的条件。实际上,这并不总是正确的。许多JVM实现,包括ORacle one,allow to come to existance。实际上,这是非常罕见的,但也是可能的。引用超出Java语言变量范围的意义并不总是意味着引用也超出了实现的范围(在JVM中存储变量的实际低级堆栈).不过,在大多数情况下,我更关心的是编码风格,而不是这些微妙之处。
 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
 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