java - 当 JVM 使用 for-each 循环迭代数组时,它会创建迭代器吗?

标签 java foreach iterator

很抱歉,如果已经有人问过这个问题,但我在 stackoveflow 上没有找到答案,也没有看到有关该领域的官方教程。

问题就在标题中 - 如果我们有这样的代码

int[] array = new int[20];
for (int el : array) {
   ...
}

JVM 会将其作为标准 for 循环运行

for (int i = 0; i < array.length; i++)

或者它会创建一个迭代器?

UPD此链接可能有助于完成答案

Fastest way to iterate an Array in Java: loop variable vs enhanced for statement

最佳答案

Java 中的数组不实现 Iterable 接口(interface),因此您无法从数组获取迭代器。此外,您不能在原始类型(例如 int)上使用迭代器,因为原始类型不能是泛型参数。例如。如果你想要一个迭代器,你必须使用迭代器,如果它由 int[] 支持,这将导致大量的自动装箱和拆箱。

JVM 不太可能为数组上的 for-each 循环创建迭代器,因为它的效率非常低。

事实上,编译器会将 for-each 循环转换为索引 for 循环。您可以通过查看该方法的反编译字节码来检查:

源代码:

public void test() {
    int[] array = new int[20];
    for (int el : array) {
        System.out.println("test");
    }
}

反编译的字节码:

public void test() {
    int[] array = new int[20];
    int[] var2 = array;
    int var3 = array.length;

    for(int var4 = 0; var4 < var3; ++var4) {
        int var10000 = var2[var4];
        System.out.println("lol");
    }

}

关于java - 当 JVM 使用 for-each 循环迭代数组时,它会创建迭代器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30189067/

相关文章:

java - foreach 变量在编译时导致 "<identifier> expected"错误

c# - 将 foreach 语句动态附加到 C# 代码

python - 检查 python 迭代器中元素的存在

c++ - 如何使迭代器成为 "automatically dereferenced"?

python - 两个相反的迭代器,列表分配索引范围错误

java - 无法将名称 [org.hibernate.spatial.dialect.postgis.PostgisDialect] 解析为策略 [org.hibernate.dialect.Dialect]

java - 根据我的要求在java中按长度分割字符串

javascript - JavaScript 中的异步 foreach

java - Hibernate 验证标签不起作用。 BindingResult 始终为 false

java - 尝试访问类别时出现状态 404