我想知道应该使用以下哪一项:
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);
}
答案 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,那就选择第二个。
如果你在处理一个可变类型,我会选择第一个(取决于代码的其余部分,以及其他一些元素)