我知道 new for each loop 适用于 Iterable 和数组,但我不知道使用数组时幕后发生了什么。
谁能帮我理解这一点?提前致谢。
int[] number = new int[10];
for(int i: number) {
}
循环等效于:
for(int j = 0; j < number.length; j++) {
int i = number[j];
...
}
其中 j 是内部生成的引用,与普通用户标识符不冲突。
有点晚了,但就在这里。
编译器知道您是对集合还是数组使用 for-each 循环语句。
如果用于收集,编译器会将 for-each 循环转换为使用Iterator
.
如果用于数组,编译器将使用索引变量将 for-each 循环转换为等效的 for 循环。
在您的代码中,您在内存中分配了一个由 10 个整数组成的数组并获得对它的引用。在 for 循环中,您只需遍历数组中的每个项目,所有项目的初始值为 0。当您迭代数组元素时,每个项目的值都将存储在i
for 循环中声明的变量中。
这相当于:
for(int x = 0; x < number.length; x++) {
int i = number[x];
}
这相当于:
final int len = number.length;
for(int j = 0; j < len; j++) {
int i = number[j];
}
请注意, forEach 不会评估每个循环中的 .length 。这也可能被 JVM 消除,但尤其是在集合的情况下,有些人会使用
for(int j = 0; j < collection.size(); j++) {
它对更快的速度产生了(小)差异
int len = collection.size()
for(int j = 0; j < len; j++) {
for each over 数组本质上是对这个结构的“糖”:
for(int i = 0;i<number.length;i++)
{
}
我想这是作为语言的构造提供的,以便人们可以在以旧方式迭代的结构上使用增强的 for 循环。
IntStream.range(1,4)
可以使用,如果使用 java 8。