java foreach 循環原理


java foreach 語法是在jdk1.5時加入的新特性,主要是當作for語法的一個增強,那么它的底層到底是怎么實現的呢?因為面試時被問到,所以在這邊做一個記錄。

首先來看看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。

那數組呢?數組沒有實現為什么也可以用呢?

那是因為遍歷數組時,會轉換為對數組中的每一個元素的循環引用,相當於for語法循環遍歷一樣。

 

那么為什么是數組或者實現了這個接口,就能實現遍歷呢?其實是因為編譯器的原因,在編譯中的語義分析過程中,有一個解除語法糖的操作,(語法糖是啥?可以理解成編譯器為方便開發人員開發,會對特定代碼做一些特殊處理,方便開發人員使用,除了foreach,java中還有泛型、裝箱、拆箱、變長字符串等)。

  • 對於list編譯器會調用Iterable接口的 iterator方法來循環遍歷數組的元素,iterator方法中是調用Iterator接口的的 next()和hasNext()方法來做循環遍歷。java中有一個叫做迭代器模式的設計模式,這個其實就是對迭代器模式的一個實現。
  • 對於數組,就是轉化為對數組中的每一個元素的循環引用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM