1.foreach 加強for循環(foreach循環)java
jdk1.5以後增長的新特性數組
foreach簡化了for循環遍歷安全
foreach語法最終被編譯器轉爲了對Iterator.next()的調用,因此不會由下標遍歷。而for循環則是採用下標訪問。ide
須要循環數組結構的數據時,建議使用普通for循環,由於for循環採用下標訪問,對於數組結構的數據來講,採用下標訪問比較好。函數
須要循環鏈表結構的數據時,必定不要使用普通for循環,這種作法很糟糕,數據量大的時候有可能會致使系統崩潰。優化
到底是如何實現foreach的呢,想一想多是編譯器作了優化,就看了下最終編譯成的字節碼 public class Iterable_eros { List<String> strings; public void display(){ for(String s : strings){ System.out.println(s); } } 相應的字節碼爲 public void display (){ line0 : aload_0 getfield java.util.List my.lang.Iterable_eros.strings invokeinterface java.util.Iterator java.util.List.iterator() 1 astore_2 goto line30 line13 : aload_2 invokeinterface java.lang.Object java.util.Iterator.next() 1 checkcast java.lang.String astore_1 line23 : getstatic java.io.PrintStream java.lang.System.out aload_1 line27 : invokevirtual void java.io.PrintStream.println(java.lang.String) line30 : aload_2 invokeinterface boolean java.util.Iterator.hasNext() 1 ifne line13 line39 : return 果真沒猜錯哈!能夠看到,foreach語法最終被編譯器轉爲了對Iterator.next()的調用。而做爲使用者的咱們, jdk並沒用向咱們暴露這些細節,咱們甚至不須要知道Iterator的存在,認識到jdk的強大之處了吧。 爲了證明本身的想法,用Iterator寫了個遍歷List的方法查看了字節碼,果真跟foreach的形式基本同樣,固然這是後話~ public void display(){ for(String s : strings){ System.out.println(s); } Iterator<String> iterator = strings.iterator(); while(iterator.hasNext()){ String s = iterator.next(); System.out.println(s); } } public void display (){ line0 : aload_0 getfield java.util.List my.lang.Iterable_eros.strings invokeinterface java.util.Iterator java.util.List.iterator() 1 astore_2 goto line30 line13 : aload_2 invokeinterface java.lang.Object java.util.Iterator.next() 1 checkcast java.lang.String astore_1 line23 : getstatic java.io.PrintStream java.lang.System.out aload_1 line27 : invokevirtual void java.io.PrintStream.println(java.lang.String) line30 : aload_2 invokeinterface boolean java.util.Iterator.hasNext() 1 ifne line13 aload_0 getfield java.util.List my.lang.Iterable_eros.strings invokeinterface java.util.Iterator java.util.List.iterator() 1 astore_1 line49 : goto line69 line52 : aload_1 invokeinterface java.lang.Object java.util.Iterator.next() 1 checkcast java.lang.String astore_2 line62 : getstatic java.io.PrintStream java.lang.System.out aload_2 line66 : invokevirtual void java.io.PrintStream.println(java.lang.String) line69 : aload_1 invokeinterface boolean java.util.Iterator.hasNext() 1 ifne line52 line78 : return 這邊還發現一個比較有趣的現象:在取Iterator.next()以後並在把該值load進內容棧以前,編譯器調用了checkcast java.lang.String方法來進行類型安全檢查,jdk應該是採用這個來檢測並拋出ClassCastException的。
2.this()和super()區別this
this() 一是引用調用隱式參數(本類中this.的成員變量),二是調用該類中其餘構造函數spa
super一是調用父類構造函數,二是調用父類的方法。code