1

这些方法之间有什么实际区别吗?(内存、GC、性能等?)

while...{
   Object o=new Object();
   ...
   o=new Object();
   ...
}

Object o;
while...{
   o=new Object();
   ...
   o=new Object();
   ...
}
4

4 回答 4

2

来自有效的 Java 第 2 版

最小化局部变量范围的最强大的技术是在第一次使用它的地方声明它。如果一个变量在使用之前就被声明了,那就是混乱了——另外一件事情会分散试图弄清楚程序做什么的读者的注意力。到使用变量时,读者可能不记得变量的类型或初始值。

过早地声明一个局部变量不仅会导致其范围过早地扩展,而且会导致其结束得太晚。局部变量的范围从声明它的点延伸到封闭块的末尾。如果变量在使用它的块之外声明,则在程序退出该块后它仍然可见。如果一个变量在其预期使用区域之前或之后被意外使用,后果可能是灾难性的。

换句话说,性能(CPU,内存)的差异与您的情况无关。更重要的是程序的语义和正确性,这在您的第一个代码示例中更好。

于 2012-11-09T19:00:32.277 回答
1

在您的第一个示例中,o将在您的 while 循环完成后超出范围。

现在,如果您实际上并未o在 while 循环之外使用(即使您将它引用的对象加载到不同的结构中),这很好,但您将无法o在循环之外访问

此外,这只是挑剔,但这些都不会编译,因为你声明Object o了两次。

于 2012-11-09T16:31:29.910 回答
1

我认为您需要在对象重用和垃圾收集的资格+可读性之间进行权衡。

最小范围总是增加可读性并最大限度地减少错误倾向。

同样,如果某些对象的创建成本太高(如线程、数据库连接),则应考虑重用。它们通常不在循环内创建,而是缓存在池中。

这就是连接池和线程 如此受欢迎的原因。

于 2012-11-09T16:34:28.517 回答
1

在选项 1 的情况下,当循环结束时,对象将有资格进行 GC,而在选项 2 中,对象将持续到方法结束。

于 2012-11-09T17:29:48.657 回答