java 關鍵字

  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的。
foreach實現原理

        2.this()和super()區別this

this() 一是引用調用隱式參數(本類中this.的成員變量),二是調用該類中其餘構造函數spa

super一是調用父類構造函數,二是調用父類的方法。code

相關文章
相關標籤/搜索