Java中的 for-each 语句(相关接口Iterable,Iterator)

Java中的 for-each 语句(相关接口Iterable,Iterator)

java中的for-each语句最终会调用Iterable.iterator(),Iterator.next(),和iterator.hasNext()方法。

测试代码:

public class For {
          
   
    public void test(){
          
   
        List<Integer> lis = new ArrayList<Integer>();
        for(Integer i : lis){
          
   
            System.out.println(i);
        }
    }
    public static void main(String[] args) {
          
   
        new For().test();
    }
}

使用javap -c For.class 查看该class文件的test()方法的字节码:

public void test();
    Code:
       0: new           #2                  // class java/util/ArrayList
       3: dup
       4: invokespecial #3                  // Method java/util/ArrayList."<init>":()V
       7: astore_1
       8: aload_1
       9: invokeinterface #4,  1            // InterfaceMethod java/util/List.iterator:		    ()Ljava/util/Iterator;
      14: astore_2
      15: aload_2
      16: invokeinterface #5,  1            // InterfaceMethod java/util/Iterator.hasNext:()Z
      21: ifeq          44
      24: aload_2
      25: invokeinterface #6,  1            // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      30: checkcast     #7                  // class java/lang/Integer
      33: astore_3
      34: getstatic     #8                  // Field java/lang/System.out:Ljava/io/PrintStream;
      37: aload_3
      38: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      41: goto          15
      44: return

可以看到for-each语句会自动调用第9,16,25行的方法。

这些方法分别是java/util/List.iterator(),java/util/Iterator.hasNext(),InterfaceMethod java/util/Iterator.next()

第9行:java/util/List.iterator()来自List,实际最终继承自java/lang/Iterable.iterator方法;该方法返回一个java/util/Iterator对象。

所有能使用for-each语句的类,都得实现java/lang/Iterable,以下是jdk文档原话:

Implementing this interface allows an object to be the target of the "for-each loop" statement.

第16行和25行的方法java/util/Iterator.hasNext(),InterfaceMethod java/util/Iterator.next()来自java/util/Iterator接口,hasNext()在for-each语句中判断集合中是否还有数据,next()方法取出该数据。

经验分享 程序员 微信小程序 职场和发展