java foreach 循环原理

java foreach 语法是在jdk1.5时加入的新特性,主要是看成for语法的一个加强,那么它的底层究竟是怎么实现的呢?由于面试时被问到,因此在这边作一个记录。java

首先来看看foreach可以使用的类型是什么:面试

 

编译器报错缘由写的很清楚了,要求:数组或java.lang.Iterable设计模式

看下jdk源码对Iterable接口的声明:数组

/** Implementing this interface allows an object to be the target of
 *  the "foreach" statement.
 * @since 1.5
 */
public interface Iterable<T> {

    /**
     * Returns an iterator over a set of elements of type T.
     * 
     * @return an Iterator.
     */
    Iterator<T> iterator();
}

实现此接口,容许成为foreach语法的target。this

那数组呢?数组没有实现为何也能够用呢?spa

那是由于遍历数组时,会转换为对数组中的每个元素的循环引用,至关于for语法循环遍历同样。设计

 

那么为何是数组或者实现了这个接口,就能实现遍历呢?实际上是由于编译器的缘由,在编译中的语义分析过程当中,有一个解除语法糖的操做,(语法糖是啥?能够理解成编译器为方便开发人员开发,会对特定代码作一些特殊处理,方便开发人员使用,除了foreach,java中还有泛型、装箱、拆箱、变长字符串等)。code

  • 对于list编译器会调用Iterable接口的 iterator方法来循环遍历数组的元素,iterator方法中是调用Iterator接口的的 next()和hasNext()方法来作循环遍历。java中有一个叫作迭代器模式的设计模式,这个其实就是对迭代器模式的一个实现。
  • 对于数组,就是转化为对数组中的每个元素的循环引用
相关文章
相关标签/搜索