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