22

我知道 new for each loop 适用于 Iterable 和数组,但我不知道使用数组时幕后发生了什么。

谁能帮我理解这一点?提前致谢。

int[] number = new int[10];

for(int i: number) {

}
4

7 回答 7

16

循环等效于:

for(int j = 0; j < number.length; j++) {
  int i = number[j];
  ...
}

其中 j 是内部生成的引用,与普通用户标识符不冲突。

于 2013-01-10T19:39:47.423 回答
11

有点晚了,但就在这里。

编译器知道您是对集合还是数组使用 for-each 循环语句。

如果用于收集,编译器会将 for-each 循环转换为使用Iterator.

如果用于数组,编译器将使用索引变量将 for-each 循环转换为等效的 for 循环。

这是 oracle.com 上的描述

于 2016-01-25T22:06:51.677 回答
3

在您的代码中,您在内存中分配了一个由 10 个整数组成的数组并获得对它的引用。在 for 循环中,您只需遍历数组中的每个项目,所有项目的初始值为 0。当您迭代数组元素时,每个项目的值都将存储在ifor 循环中声明的变量中。

于 2013-01-10T19:39:05.820 回答
2

这相当于:

for(int x = 0; x < number.length; x++) {
  int i = number[x];
}
于 2013-01-10T19:40:28.483 回答
1

这相当于:

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++) {
于 2013-01-10T19:55:24.347 回答
0

for each over 数组本质上是对这个结构的“糖”:

for(int i = 0;i<number.length;i++)
{  
}

我想这是作为语言的构造提供的,以便人们可以在以旧方式迭代的结构上使用增强的 for 循环。

于 2013-01-10T19:39:56.273 回答
0

IntStream.range(1,4)可以使用,如果使用 java 8。

于 2016-11-23T13:02:49.010 回答