Java - 在for循环中声明变量

时间:2010-12-21 16:27:35

标签: java micro-optimization

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

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

VS

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

5 个答案:

答案 0 :(得分:24)

  

在循环中声明一个变量是不好的做法吗?

完全没有!它将变量本地化为其使用点。

  

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

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

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

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:2)

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

例如,如果您只是一次写入引用,那么使用 intent 更清楚地使用以下内容:

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

对战:

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

这取决于。假设你的编译器没有改变任何东西,效率低下来自创建String对象的开销。一旦超出范围,内存将被清除。