在java程序中對foreach的使用多見於集合類的遍歷,foreach可以遍歷集合是由於實現了iterable的接口,其中定義了Iterator迭代器的產生方法html
原代碼大部分源自https://www.cnblogs.com/vinozly/p/5465454.html
複製代碼
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