java foreach 語法是在jdk1.5時加入的新特性,主要是當作for語法的一個增強,那么它的底層到底是怎么實現的呢?因為面試時被問到,所以在這邊做一個記錄。
首先來看看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。
那數組呢?數組沒有實現為什么也可以用呢?
那是因為遍歷數組時,會轉換為對數組中的每一個元素的循環引用,相當於for語法循環遍歷一樣。
那么為什么是數組或者實現了這個接口,就能實現遍歷呢?其實是因為編譯器的原因,在編譯中的語義分析過程中,有一個解除語法糖的操作,(語法糖是啥?可以理解成編譯器為方便開發人員開發,會對特定代碼做一些特殊處理,方便開發人員使用,除了foreach,java中還有泛型、裝箱、拆箱、變長字符串等)。
- 對於list編譯器會調用Iterable接口的 iterator方法來循環遍歷數組的元素,iterator方法中是調用Iterator接口的的 next()和hasNext()方法來做循環遍歷。java中有一個叫做迭代器模式的設計模式,這個其實就是對迭代器模式的一個實現。
- 對於數組,就是轉化為對數組中的每一個元素的循環引用