循环内与循环外变量声明[重复]
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 将字符串文字与变量连接起来。因此,“您最终将向字符串池中添加大量新的中途字符串对象”是不正确的。以上是关于循环内与循环外变量声明[重复]的主要内容,如果未能解决你的问题,请参考以下文章