代码如下:
List list=new ArrayList();
list.add(1);
list.add(2);
for(Object o:list)
System.out.println(o);
字节码如下,30~60行
0: new #3 // class java/util/ArrayList
3: dup
4: invokespecial #4 // Method java/util/ArrayList."<init>":()V
7: astore_1
8: aload_1
9: iconst_1
10: invokestatic #5 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
13: invokeinterface #6, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
18: pop
19: aload_1
20: iconst_2
21: invokestatic #5 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
24: invokeinterface #6, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
29: pop
30: aload_1
31: invokeinterface #7, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
36: astore_2
37: aload_2
38: invokeinterface #8, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
43: ifeq 63
46: aload_2
47: invokeinterface #9, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
52: astore_3
53: getstatic #10 // Field java/lang/System.out:Ljava/io/PrintStream;
56: aload_3
57: invokevirtual #11 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
60: goto 37
63: return
java的字节码
1、31调用了Iterable接口的iterator方法获得迭代器
2、38 调用hashnext(——)
3、47调用next
4、60 goto跳回37
所以foreach是调用了迭代器实现,手动实现代码如下:
public class MyArrayList implements Iterable {
private Object[] os=new Object[10];
private int size=0;
public void setObject(Object o){
if(size<10)
os[size++]=o;
}
@Override
public Iterator iterator() {
return new MyIterator();
}
private class MyIterator implements Iterator{
private int location=0;
@Override
public boolean hasNext() {
if(size>location)
return true;
return false;
}
@Override
public Object next() {
return os[location++];
}
}
}
public class Test {
public static void main(String[] args) {
MyArrayList myArrayList=new MyArrayList();
myArrayList.setObject(1);
myArrayList.setObject(2);
for (Object o : myArrayList) {
System.out.println(o);
}
}
}