栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java集合foreach原理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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."":()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);
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/284704.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号