java集合foreach原理

代码如下:

   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);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值