Java - foreach 原理
Posted 程序员牧码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java - foreach 原理相关的知识,希望对你有一定的参考价值。
在平时Java程序中,应用比较多的就是对Collection集合类的foreach遍历,foreach之所以能工作,是因为这些集合类都实现了Iterable接口,该接口中定义了Iterator迭代器的产生方法,并且foreach就是通过Iterable接口在序列中进行移动。
Iterable 接口 API
package java.lang;
import java.util.Iterator;
public interface Iterable {
public abstract Iterator iterator();
}
该接口中定义了产生Iterator迭代器的方法
package java.util;
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
public abstract void remove();
}
那么为什么实现了Iterable接口就支持foreach操作了呢?
我们写段foreach小程序看看字节码是怎么样的吧!
package test;
import java.util.List;
public class TestForeach {
List<Integer> integers;
public void testForeach(){
for(Integer i : integers){
}
}
}
其中TestForeach方法的详细字节码如下
public void testForeach();
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
29 0 2 i Ljava/lang/Integer;
0 33 0 this Ltest/TestForeach;
}
我们重点看红色部分,我来简单解释一下这段字节码的作用
0:加载this到操作栈
1:获取字段integers
4:调用integers的接口方法interator
9:将返回的迭代器赋给本地变量?(我们看到在最下面的本地变量区的Slot列,有0和2,但是没有1。事实上,1 就是编译器为我们生成的一个迭代器变量),这边就是给这个迭代器赋值
核心实现就是以上几行字节码,其余的部分就是和接下来的迭代器遍历有关了,有兴趣的朋友可以看看。
以上是关于Java - foreach 原理的主要内容,如果未能解决你的问题,请参考以下文章