Java的ForEach

Java的ForEach是Java5引入的新特性,简化了代码编写。虽然存在局限性,但其底层实现依然高效。通过分析一个简单的求和程序的字节码,可以发现ForEach操作栈大小为2,本地变量数组大小为5。遍历过程中,它将数组引用、大小、初始化的索引和元素依次处理,与普通for循环类似,只是隐藏了下标操作。
摘要由CSDN通过智能技术生成

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循环是一样的,只是省略了下标而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值