循环内与循环外变量声明[重复]

Posted

技术标签:

【中文标题】循环内与循环外变量声明[重复]【英文标题】:in-loop vs out-of-loop variable declaration [duplicate] 【发布时间】:2014-06-15 01:11:21 【问题描述】:

在如下代码中:

for(int i=0; i<1000000; i++)
    String abc = "blahblahblah";
    abc = abc + foo();
    //save abc to file

我应该在此循环之前声明 abc,还是应该以某种方式优化代码以使这种差异无关紧要?

【问题讨论】:

在你每次循环中都重新声明abc,所以在循环结束时它几乎不会改变。 在所有情况下配置文件以获得您特定情况的答案,但由于字符串实习,它可能没有太大的区别。对于一般对象,在循环之外创建一次肯定会更好。无论如何,应该在循环之外声明的不是 abc,而是“blahblahblah” 看来你需要BufferedWriter 这里没有“全局声明”。调整了你的标题。 【参考方案1】:

如果您只打算在循环内部使用该变量,最好在内部声明它。这样,当您进入循环的下一次迭代时,可以清除使用的内存。否则,您将不得不等到声明它的方法结束,或者当 Object 它是它的成员时,它才有资格进行垃圾收集。这对于原始变量(与您的 String 对象相对)略有不同,无论如何,在方法结束后总会被清除。

换句话说,变量的范围应始终尽可能小,以节省内存(以及其他原因)。

更多详情请见this answer。

至于 speed 的性能,在循环内部或外部声明它应该没有任何区别。由bytecode analysis here 和comprehensive logical analysis here 确认。

我希望这会有所帮助。

【讨论】:

“你最终会在字符串池中添加大量新的中途字符串对象” 到池中?什么?你的意思是“堆”吗?只有字符串字面量和从intern() 返回的字面量才会被实习。 连接字符串不会实习,所以你答案的最后一段没有任何意义。在循环内连接字符串可能会在堆上积累大量临时对象,但与池无关。 这与我刚才所说的无关。你应该重读一遍。 @Rudi 这既不是我所描述的,也不是 OP 正在做的事。这无关紧要。 OP is 将字符串文字与变量连接起来。因此,“您最终将向字符串池中添加大量新的中途字符串对象”是不正确的。

以上是关于循环内与循环外变量声明[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JAVA变量声明在循环体内还是循环体外

变量声明在循环体内还是循环体外的争论

为什么不能在JavaScript循环中更改变量,而该变量只是在变量外声明的]]

在循环体外面定义的变量和里面定义的变量有啥区别?

当前范围错误中的重复声明;两个循环具有相同的变量,可变范围

在循环之前或循环中声明变量之间的区别?