Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVM在使用for-each循环遍历数组时是否创建迭代器?_Java_Foreach_Iterator - Fatal编程技术网

Java JVM在使用for-each循环遍历数组时是否创建迭代器?

Java JVM在使用for-each循环遍历数组时是否创建迭代器?,java,foreach,iterator,Java,Foreach,Iterator,抱歉,如果已经有人问过了,但我在stackoveflow上没有找到答案,我也没有看到关于这个领域的官方教程 问题在标题中-如果我们有类似的代码 int[] array = new int[20]; for (int el : array) { ... } JVM会将其作为循环的标准运行吗 for (int i = 0; i < array.length; i++) for(int i=0;i

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

问题在标题中-如果我们有类似的代码

int[] array = new int[20];
for (int el : array) {
   ...
}
JVM会将其作为循环的标准运行吗

for (int i = 0; i < array.length; i++)
for(int i=0;i
或者它将创建一个迭代器

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


Java中的数组没有实现Iterable接口,因此无法从数组中获取迭代器。此外,不能在诸如int之类的基元类型上使用迭代器,因为基元类型不能是泛型参数。例如,如果需要迭代器,则必须使用迭代器,这将导致大量的自动装箱和-取消装箱(如果有int[]支持)

JVM不太可能为数组上的每个循环创建迭代器,因为这样会非常低效

事实上,编译器会将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");
    }

}
公共无效测试(){
int[]数组=新的int[20];
int[]var2=数组;
int var3=array.length;
for(int var4=0;var4
For each循环是普通For循环的一种可移植形式,它是一种更好的构建数据结构

cars是一个数组,例如:

  for(Car car: cars){
       //car.name() = audi...
       ....
        }
实际上与下面显示的代码相同

for(Iterator<Car> iterator = cars.iterator(); iterator.hasNext(); ){
   Car car = iterator.next();
   //car.name() = audi...
   ......
}
for(Iterator Iterator=cars.Iterator();Iterator.hasNext();){ Car=iterator.next(); //car.name()=奥迪。。。 ...... }
您想知道它的原因是什么?JVM和优化器可以按照自己的意愿来做。@chokdee这是关于优化的。我有一个方法运行在预定义的字符串列表上,并检查该列表是否有包含特定字符串的项。此方法用作大型应用程序缓存(10k-100k项)上的谓词,因此我们发现JVM每次遍历都会创建数千个迭代器。现在它将被重新写入数组,我想知道迭代器的实例化。您测量了结果了吗?我写了一个100k迭代的简单测试,两个都有相同的结果,这里有一个相同的问题:@chokdee谢谢你的链接,我知道我需要字节码来验证它,我只是不想浪费时间在可能已经有人检查过的事情上。