【发布时间】:2021-10-13 13:01:31
【问题描述】:
我很惊讶地在 Cay Horstmann 的 Java 9 书中读到,每次都在增强的 for 循环中将内存分配给临时对象:
“每次迭代都会创建一个新变量 arg”(第 3 章,第 126 页)
for(String arg:args) {
...
}
我一直认为编译器会在进入循环之前为循环中的局部变量分配空间,以优化性能。
为什么每次都要创建变量?
before 是在 C 的上下文中提出的这个问题,但不是在 Java 中提出的。我一般要求一个循环,而不仅仅是这种情况。
【问题讨论】:
-
每次都会创建一个新变量(Java 中的引用),因为它在每次迭代中指向不同的值。但是内存 - 可能是/可能不是 - 了解字符串文字池?
-
@Kris:这与字符串池完全无关。
arg引用的任何字符串都已经存在于args中,因此无论如何都不会创建新的字符串对象。 -
@JoachimSauer 你是对的,问题标题包含内存分配,所以我提到了。
-
局部变量的内存不是以经典方式“分配”的,而是JVM将为给定方法的所有局部变量保留足够的内存(这在编译时是已知的)。虽然
arg在每次迭代中都可以被视为一个新变量(具有新值),但它几乎肯定会重复使用相同的插槽(即内存中的相同位置)。
标签: java