java基本素养-----forEach实现原理

forEach实现原理

一:foreach语法最终被编译器转为了对Iterator.next()的调用

  1. public void display(){  
  2. List strings;
  3.         for(String s : strings){  
  4.             System.out.println(s);  
  5.         }  
  6.           
  7.         Iterator iterator = strings.iterator();  
  8.         while(iterator.hasNext()){  
  9.             String s = iterator.next();  
  10.             System.out.println(s);  
  11.         }  
  12.     }  

字节码分析:

  1. public void display (){  
  2. line0    : aload_0    
  3.            getfield  java.util.List my.lang.Iterable_eros.strings  
  4.            invokeinterface  java.util.Iterator java.util.List.iterator() 1  
  5.            astore_2    
  6.            goto  line30  
  7. line13   : aload_2    
  8.            invokeinterface  java.lang.Object java.util.Iterator.next() 1  
  9.            checkcast  java.lang.String  
  10.            astore_1    
  11. line23   : getstatic  java.io.PrintStream java.lang.System.out  
  12.            aload_1    
  13. line27   : invokevirtual  void java.io.PrintStream.println(java.lang.String)  
  14. line30   : aload_2    
  15.            invokeinterface  boolean java.util.Iterator.hasNext() 1  
  16.            ifne  line13  
  17.            aload_0    
  18.            getfield  java.util.List my.lang.Iterable_eros.strings  
  19.            invokeinterface  java.util.Iterator java.util.List.iterator() 1  
  20.            astore_1    
  21. line49   : goto  line69  
  22. line52   : aload_1    
  23.            invokeinterface  java.lang.Object java.util.Iterator.next() 1  
  24.            checkcast  java.lang.String  
  25.            astore_2    
  26. line62   : getstatic  java.io.PrintStream java.lang.System.out  
  27.            aload_2    
  28. line66   : invokevirtual  void java.io.PrintStream.println(java.lang.String)  
  29. line69   : aload_1    
  30.            invokeinterface  boolean java.util.Iterator.hasNext() 1  
  31.            ifne  line52  
  32. line78   : return 

二:举例

 List arrList = new ArrayList<>();
        arrList.add("1");
        arrList.add("2");
        arrList.add("3");
        for(String ag:arrList){
            System.out.println(ag);
        };
        for (Iterator iterat = arrList.iterator(); iterat.hasNext();){
            System.out.println(iterat.next());
        }
       forEach像 for一样循环遍历数组,是用下标遍历来实现
        for (int i = 0; i < arr.length; i++) { 
            type var = arr[i];
            body-of-loop
        }
1、ArrayList之所以能使用foreach循环遍历,是因为ArrayList所有的List都是Collection的子接口,而Collection是Iterable的子接口,ArrayList的父类AbstractList正确地实现了Iterable接口的iterator方法。

2、任何一个集合,无论是JDK提供的还是自己写的,只要想使用foreach循环遍历,就必须正确地实现Iterable接口
 

你可能感兴趣的:(学习文档)