变量定义的外部循环和内部循环之间是否存在差异?

时间:2012-12-23 19:22:30

标签: java

  

可能重复:
  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?
}

7 个答案:

答案 0 :(得分:3)

在第一个示例中,变量可以在 for-loop 的范围之外使用,而另一个在 for-loop 中可见。< / p>

答案 1 :(得分:2)

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

范围:

变量的范围是不同的:

  • 在声明(并初始化)方法之后,外部循环可以访问该方法,包括在循环内
  • 在循环中定义的变量只能在里面循环中访问

初始化:

如果你的循环可能没有迭代,那么在第一个例子中变量将是未初始化的,所以你不能在循环之后使用它,直到你给它一个值(即使该值是null

垃圾收集:

可用于垃圾收集的点是:

  1. 在示例1的方法中的最后一次使用之后
  2. 在例如2的循环结束时

答案 2 :(得分:2)

如果你没有用字符串文字写出你的例子,这基本上是一个单例常量,那么答案就是在两种情况下都会创建10个对象。在您的具体示例中,不会创建任何对象

答案 3 :(得分:1)

因为它是一个字符串文字,所以不会被创建10次。它将被保存在permgen空间而不是堆空间。

答案 4 :(得分:0)

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

"foo" == "foo"

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

一方是否更好,这实际上取决于你在循环之后需要对str做些什么。

干杯,

答案 5 :(得分:0)

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

Refer to this link

答案 6 :(得分:0)

在第一种情况下,循环的变量全局初始化为一个值,其中引用被更改10次,而在第二种情况下,循环的局部变量以相同的值重新初始化10次

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

最好使用数组,向量或链表进行多变量初始化