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中有一個叫作迭代器模式的設計模式,這個其實就是對迭代器模式的一個實現。
  • 對於數組,就是轉化爲對數組中的每個元素的循環引用
相關文章
相關標籤/搜索