Java的ForEach

时间:2014-05-02 18:57:50   收藏:0   阅读:356

ForEachJava5带来的新特性之一。尽管有其局限性,ForEach还是极大方便了程序员编写简介的代码。那么,其底层是如何实现的呢?

来看一个段简单的求和程序:

public class ForEach {
    private static int[] arrs = new int[]{1,2,3,4};
    private static int sum = 0;

    public static void main(String[] argv) {
        for (int e : arrs) {
               sum += e;
         }
    }
}


编译后的字节码如下:

public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=5, args_size=1
0: getstatic #2 // Field arrs:[I
3: astore_1
4: aload_1
5: arraylength
6: istore_2
7: iconst_0
8: istore_3
9: iload_3
10: iload_2
11: if_icmpge 34
14: aload_1
15: iload_3
16: iaload
17: istore 4
19: getstatic #3 // Field sum:I
22: iload 4
24: iadd
25: putstatic #3 // Field sum:I
28: iinc 3, 1
31: goto 9
34: return


编译的结果可知,操作栈的大小为2,本地变量数组的大小为5。指令0-3将数组arrs引用放到本地变量数组1号元素里。指令4-6首先获得数组arrs大小,然后放到本地变量数组2号元素里。7-8将本地数组3号位初始化位09-11加载数组3号元素和2号元素(arrs的大小),if_icmpge大小比较,如果大于则跳转到34号指令直接返回(34:return)。14-17读取数组arrs中的元素(下标是本地数组3号元素的值),并存到本地数组4号位置。19-25加载4号位和sum变量值,并且相加,结果再存回去。28指令将本地数组3号元素加131指令则跳转到9号指令上。

可见,ForEach指令同普通的for循环是一样的,只是省略了下标而已。

Java的ForEach,布布扣,bubuko.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!