17

在循环内声明变量是不好的做法吗?在我看来,这样做,如下面的第一个代码块所示,将使用十倍于第二个代码块的内存......由于在循环的每次迭代中创建一个新字符串。这个对吗?

for (int i = 0; i < 10; i++) {
  String str = "Some string";
}

对比

String str;
for (int i = 0; i < 10; i++) {
  str = "Some String";
}
4

5 回答 5

26

在循环内声明变量是不好的做法吗?

一点也不!它将变量本地化到其使用点。

在我看来,这样做,如下面的第一个代码块所示,将使用十倍于第二个代码块的内存

编译器可能会优化事物以保持内存使用效率。仅供参考:如果您使用final关键字告诉它您的变量具有对对象的固定引用,您可以帮助它。

注意:如果您有一个更复杂的对象,您在构造函数中执行复杂的代码,那么您可能需要担心单次执行与多次执行,并在循环之外声明该对象。

于 2010-12-21T16:29:29.653 回答
7

在这两个示例中,您将实例化一个包含相同次数的字符串“Some String”的新字符串对象。

在第一个str在循环内部声明的示例中,在 for 循环完成后对该字符串的所有引用都将丢失,从而允许 Java 的垃圾收集器从内存中删除所有字符串实例。但是,在您str在循环外声明的第二个示例中,您创建的最后一个字符串仍然会在循环外引用它,并且 Java 的垃圾收集器只会从内存中删除 10 个字符串中的 9 个。

因此,第一种方法更好,因为您不保留对字符串的任何引用,这会干扰垃圾收集器确定它是否仍在使用中的能力。

于 2010-12-21T16:33:02.530 回答
2

除了@Jason S 所说的之外,我还鼓励您考虑代码的可读性。

例如,如果您只写一次引用,那么使用以下内容会使您的意图更加清晰:

String str = "write once";
while(condition){
    //do stuff with str
}

相对:

String str = null;
while(condition){
    str = "write once";
    //do stuff with str
}

同样,如果字符串的值确实基于特定于循环迭代的某些内容,请在循环内声明变量。

于 2010-12-21T16:36:02.193 回答
1

变量引用使用的内存很小。在循环中声明项目通常是更好的做法,因为它更接近使用它的位置并且更具可读性。

于 2010-12-21T16:30:20.227 回答
0

这取决于。效率低下是由于创建 String 对象的开销,假设您的编译器没有更改任何内容。一旦超出范围,内存将被清除。

于 2010-12-21T16:31:25.260 回答