java foreach 语法是在jdk1.5时加入的新特性,主要是看成for语法的一个加强,那么它的底层究竟是怎么实现的呢?由于面试时被问到,因此在这边作一个记录。java
首先来看看foreach可以使用的类型是什么:面试
编译器报错缘由写的很清楚了,要求:数组或设计模式
。看下jdk源码对数组
接口的声明:/** 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