在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