ForEach是Java5带来的新特性之一。尽管有其局限性,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号位初始化位0。9-11加载数组3号元素和2号元素(arrs的大小),if_icmpge大小比较,如果大于则跳转到34号指令直接返回(34:return)。14-17读取数组arrs中的元素(下标是本地数组3号元素的值),并存到本地数组4号位置。19-25加载4号位和sum变量值,并且相加,结果再存回去。28指令将本地数组3号元素加1。31指令则跳转到9号指令上。
可见,ForEach指令同普通的for循环是一样的,只是省略了下标而已。
Java的ForEach
时间: 2024-10-25 00:37:59