Java JVM在使用for-each循环遍历数组时是否创建迭代器?
抱歉,如果已经有人问过了,但我在stackoveflow上没有找到答案,我也没有看到关于这个领域的官方教程 问题在标题中-如果我们有类似的代码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
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谢谢你的链接,我知道我需要字节码来验证它,我只是不想浪费时间在可能已经有人检查过的事情上。