List<Integer> items = Arrays.asList(1, 2, 3, 4, 5);
for ( Integer item : items ) {
System.out.println(item);
}
现在我们在Java中遍历集合,一般都会像上面的代码一样使用增强for循环,我想问问它具体是怎么实现的呢?增强for循环的实现原理是什么?
List<Integer> items = Arrays.asList(1, 2, 3, 4, 5);
for ( Integer item : items ) {
System.out.println(item);
}
现在我们在Java中遍历集合,一般都会像上面的代码一样使用增强for循环,我想问问它具体是怎么实现的呢?增强for循环的实现原理是什么?
Java 的增强 for 循环(即 For-Each)是 Java 5 新增的语法糖(Java 编译器自动为我们编译为常规的for循环代码)。
根据 Java 官方的语言规范所述:如果要使用增强for循环,则被迭代的目标变量必须是一个数组或者实现了java.lang.Iterable
接口的集合。
java.lang.Iterable
接口只定义了一个必须实现的方法:public abstract java.util.Iterator<T> iterator()
,该方法用以获取迭代该集合的迭代器对象。
以提问中的上述代码为例,items
为 List 接口类型(实际上我们常见的集合类型都实现了该接口),该接口已经继承了java.lang.Iterable
接口。上述代码实际上就等价于以下代码:
List<Integer> items = Arrays.asList(1, 2, 3, 4, 5);
for ( Iterator<Integer> it = items.iterator(); it.hasNext(); ) {
Integer item = it.next();
System.out.println(item);
}
Java For-Each 循环也支持迭代数组类型,它实际上也是常规for循环的语法糖:
Integer[] items = new Integer[]{ 1, 2, 3, 4, 5 };
for (Integer item : items) {
System.out.println(item);
}
// 上面的 for-each 循环 等价于 下面的 for 循环
for ( int i = 0; i < items.length; i++) {
Integer item = items[i];
System.out.println(item);
}
此外,Java 增强 for 循环也支持原始类型的自动装箱/拆箱。