foreach的底层原理

在java程序中对foreach的使用多见于集合类的遍历,foreach可以遍历集合是由于实现了iterable的接口,其中定义了Iterator迭代器的产生方法html

原代码大部分源自https://www.cnblogs.com/vinozly/p/5465454.html
复制代码

Iterator迭代器

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

相关文章
相关标签/搜索