反编译看java for-each循环
Posted guohengcook
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反编译看java for-each循环相关的知识,希望对你有一定的参考价值。
java 1.5发行版引入的for-each循环。(引自《Effective Java》中文版第二版 第46条)
如以下对数组列表的for-each循环示例:
1 public class ForEach { 2 public static void main(String[] args) { 3 java.util.ArrayList<String> list = new java.util.ArrayList<String>(); 4 for (String s : list) { 5 //TODO 6 } 7 }//main 8 }
在JDK1.8.0_151的环境下,利用javac工具编译上面的代码,得到ForEach.class字节码文件,然后利用javap反编译这份字节码文件,如下图所示:
注意,反编译结果出现了java.util.Iterator类,并且出现了其hasNext和next方法。
看到这里,大概也明白了,for-each循环本质上其实是对迭代器模式的利用。
更简单的说,文章开头的那段代码,其实是这样的:
1 public class ForEach { 2 public static void main(String[] args) { 3 java.util.ArrayList<String> list = new java.util.ArrayList<String>(); 4 java.util.Iterator<String> iter = list.iterator(); 5 while(iter.hasNext()) { 6 iter.next(); 7 } 8 }//main 9 }
两个比较一下,for-each更加简洁,这就是for-each的优点。
也因此,可以说for-each循环是java的一颗语法糖。
【总结】:for-each循环是java语法糖,本质是迭代器模式的使用。
以上是关于反编译看java for-each循环的主要内容,如果未能解决你的问题,请参考以下文章
For-Each 循环 Java 错误 ArrayIndexOutOfBoundsException
For-Each循环Java错误ArrayIndexOutOfBoundsException
for-each不适用于表达式类型必需的数组或java.lang.iterable