可能重复:
Difference between declaring variables before or in loop?
String str;
for (int i = 0; i < 10; i++) {
str = "Hello, World"; // Is str created only 1 time?
}
上下之间有什么区别? 如果它们不同,哪一个更好?
for (int i = 0; i < 10; i++) {
String str = "Hello, World"; // Is str created 10 times?
}
答案 0 :(得分:3)
在第一个示例中,变量可以在 for-loop 的范围之外使用,而另一个在 for-loop 中可见。< / p>
答案 1 :(得分:2)
不同之处在于您可以在第一个示例中循环后访问str
变量。
变量的范围是不同的:
如果你的循环可能没有迭代,那么在第一个例子中变量将是未初始化的,所以你不能在循环之后使用它,直到你给它一个值(即使该值是null
)
可用于垃圾收集的点是:
答案 2 :(得分:2)
如果你没有用字符串文字写出你的例子,这基本上是一个单例常量,那么答案就是在两种情况下都会创建10个对象。在您的具体示例中,不会创建任何对象。
答案 3 :(得分:1)
因为它是一个字符串文字,所以不会被创建10次。它将被保存在permgen空间而不是堆空间。
答案 4 :(得分:0)
在Java中,字符串常量是 interned ,这意味着相同的字符串文字只保存在(PermGen)内存中一次,例如。:
"foo" == "foo"
是幂等的。因此,两个片段的内存占用量都相等,但在第一个片段后,您可以在循环终止后使用str
。
一方是否更好,这实际上取决于你在循环之后需要对str
做些什么。
干杯,
答案 5 :(得分:0)
从维护角度来看,第二个更好。在尽可能最窄的范围内在同一位置声明和初始化变量。不要在声明和初始化之间留下空洞,也不要污染您不需要的命名空间。
答案 6 :(得分:0)
在第一种情况下,循环的变量全局初始化为一个值,其中引用被更改10次,而在第二种情况下,循环的局部变量以相同的值重新初始化10次
注意:在两种情况下只有一个变量而不是10
最好使用数组,向量或链表进行多变量初始化