【发布时间】:2011-05-28 22:32:46
【问题描述】:
在循环内声明变量是不好的做法吗?在我看来,这样做,如下面的第一个代码块所示,将使用十倍于第二个代码块的内存......由于在循环的每次迭代中创建一个新字符串。这是正确的吗?
for (int i = 0; i < 10; i++) {
String str = "Some string";
}
对比
String str;
for (int i = 0; i < 10; i++) {
str = "Some String";
}
【问题讨论】:
-
String 是不可变类,总是在写入时创建新实例。但是您的情况,由于常量值,编译器可能会对其进行优化。
-
也许字符串对于这个例子来说是一个糟糕的选择。我真正的问题是......如果在循环中声明了一个变量,是否为每次迭代声明了一个新变量,或者编译器是否将其优化为单个变量?
-
变量声明和对象构造是两个不同的东西。如果您在执行 N 次的循环内执行
final Foo foo = new Foo(someArg);,它将构造 N 个单独的对象,而不是在执行一次的循环之外。但是如果你在循环外有final Foo foo1 = new Foo(someArg);,然后在循环内有final Foo foo = foo1,你只会实例化1个对象。字符串有点特殊,因为它们是不可变的常量,编译器可能会将其优化为创建一个 String 对象,并在每次循环中重复使用它。