反編譯看java for-each循環
阿新 • • 發佈:2018-08-24
中文 iter 註意 圖片 兩個 tor ima 這份 effect
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 = newjava.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循環