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()方法取出该数据。