变量应该在循环内部还是外部声明?

时间:2014-02-22 16:11:24

标签: java loops

我想知道应该使用以下哪一项:

String s = "";
List<String> list = new List<String>();
for(int i=0; i<100; i++){
    s = list.get(i);
    list.add(s);
}

List<String> list = new List<String>();
for(int i=0; i<100; i++){
    String s = list.get(i);
    list.add(s);
}

4 个答案:

答案 0 :(得分:7)

如今,没关系。编译器将执行多个优化,最终代码将是等效的。有一种最佳实践表明局部变量的范围应始终尽可能小。在这种情况下,最好在循环中声明变量。

我建议你看一下这个post

答案 1 :(得分:1)

来自here

  

答案强调绝对应该宣布str   在while循环中。没有ifs,没有ands,没有buts。

     

可能违反此规则的唯一情况是出于某种原因   必须挤出每个时钟周期至关重要   代码,在这种情况下,您可能要考虑实例化   在外部范围内的东西,并重新使用它而不是重新实例化   它在内部范围的每次迭代中。但是,这不适用   举个例子,由于java中字符串的不变性:一个新的   str的实例将始终在循环的开头创建   它必须在它的末尾扔掉,所以没有   在那里优化的可能性。

如果变量是原始对象,则差异 详细解释 { {3}}:

  

for primities ...在循环外声明的变量你可以做到   没有真正担心性能受到打击。如果你喜欢它宣称   在循环之外,你想要尽可能好的表现   将其声明为外部而不是初始化它。

     

for objects ...如果一个对象在循环内声明了内存   每次分配对象并初始化为   对象被执行。初始化可能不会花费那么多时间   但内存分配将是。在某些情况下,您可能无法做到   超越每个循环创建一个新对象,但如果可能的话   最好重置对象并重用它。

答案 2 :(得分:0)

我想说它更像是一个设计选择。

您是否需要访问循环上下文之外的变量?如果是这样,前者是正确的,如果你只需要它在循环中处理,那么后者。

我不是专家,但我会说如果你做第一个选项然后不使用,你有可能延迟GC。虽然,在你离开上下文之前,GC通常不会发生。

答案 3 :(得分:0)

在String的情况下,我认为它不会影响性能,因为String不可变。 唯一的“大”事情是你在第一个中更改s的指针,在第二个中你每次都创建一个新的指针。 但正如Rohit Jain评论的那样,如果你不打算在循环之外使用s,那就选择第二个。

如果你在处理一个可变类型,我会选择第一个(取决于代码的其余部分,以及其他一些元素)