2

可能重复:
在循环之前或循环中声明变量之间的区别?

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?
}
4

7 回答 7

3

在第一个示例中,该变量可以在for-loop范围之外使用,而另一个变量仅在for-loop内可见。

于 2012-12-23T19:24:15.427 回答
2

不同之处在于您可以在第一个示例中的循环之后str访问变量。

范围:

变量的作用域不同:

  • 循环外定义的变量在声明(和初始化)方法之后的任何地方都可以访问,包括循环内
  • 循环内定义的变量只能循环内访问

初始化:

如果您的循环可以不迭代,则该变量将在第一个示例中未初始化,因此您不能在循环之后使用它,直到您给它一个值(即使该值是null

垃圾收集:

它可用于垃圾收集的点是:

  1. 在示例 1 的方法中最后一次使用之后,
  2. 在循环结束时,例如 2
于 2012-12-23T19:23:52.510 回答
2

如果您没有使用基本上是单例常量的字符串文字来编写示例,那么答案将是在这两种情况下都创建了 10 个对象。在您的具体示例中,没有创建任何对象

于 2012-12-23T19:26:05.693 回答
1

由于它是一个字符串文字,它不会被创建 10 次。它将保存在 permgen 空间而不是堆空间中。

于 2012-12-23T19:26:40.123 回答
0

在 Java 中,字符串常量是interned,这意味着相同的字符串文字只保存在 (PermGen) 内存中一次,例如:

"foo" == "foo"

是幂等的。因此,您的两个片段的内存占用量将相等,但对于第一个,您可以str在循环终止后使用。

一个或另一个更好,这真的取决于你str在循环之后需要做什么。

干杯,

于 2012-12-23T19:26:29.233 回答
0

从维护的角度来看,第二个更好。在尽可能窄的范围内,在同一个地方声明和初始化变量。不要在声明和初始化之间留下一个空洞,也不要污染你不需要的命名空间。

参考这个链接

于 2012-12-23T19:27:55.397 回答
0

在第一种情况下,循环的全局变量使用引用的值初始化 10 次,而在第二种情况下,循环的局部变量使用相同的值重新初始化 10 次

注意:在这两种情况下只有一个变量而不是 10

更好地使用数组、向量或链表来进行多变量初始化

于 2012-12-23T19:46:31.963 回答