foreach的底層原理

在java程序中對foreach的使用多見於集合類的遍歷,foreach可以遍歷集合是由於實現了iterable的接口,其中定義了Iterator迭代器的產生方法html

原代碼大部分源自https://www.cnblogs.com/vinozly/p/5465454.html
複製代碼

Iterator迭代器

Iterator屬於一種對象,負責選擇集合內的元素提供給使用迭代器的用戶,做爲一個類提供了一級抽象,可將集合細節和用於訪問的代碼分離開,經過迭代器,將集合抽象成一個簡單序列,能夠靈活地改變數據,不論是什麼類型(矢量,鏈表,堆棧等)的數據java

IterableAPIthis

package java.lang;
import java.util.Iterator;
public interface Iterable
{

    public abstract Iterator iterator();
}
複製代碼

該接口定義了產生Iterator迭代器的方法:spa

package java.util;
public interface Iterator
{

    public abstract boolean hasNext();

    public abstract Object next();

    public abstract void remove();
}
複製代碼

寫段程序看字節碼code

package test;

import java.util.List;

/**
 * Created by vino on 2016/5/6.
 */
public class TestForeach {
    List<Integer> integers;
    public void testForeach(){
        for(Integer i : integers){

        }
    }
}
複製代碼
descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=3, args_size=1
         0: aload_0
         1: getfield      #2                  // Field integers:Ljava/util/List;
         4: invokeinterface #3,  1            // InterfaceMethod java/util/List.iterator:																	()Ljava/util/Iterator;
         9: astore_1
        10: aload_1
        11: invokeinterface #4,  1            //InterfaceMethod 				   java/util/Iterator.hasNext:()Z
        16: ifeq          32
        19: aload_1
        20: invokeinterface #5,  1            // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
        25: checkcast     #6                  // class java/lang/Integer
        28: astore_2
        29: goto          10
        32: return
      LineNumberTable:
        line 11: 0
        line 13: 29
        line 14: 32
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
      0     2     i   Ljava/lang/Integer;
     33     0  this   Ltest/TestForeach;
}
複製代碼

1.加載this到操做棧htm

2.獲取字段integers對象

3.調用integers的接口方法interator.next()blog

相關文章
相關標籤/搜索