zoukankan      html  css  js  c++  java
  • Foreach与迭代器

    Foreach与迭代器

          Foreach语句可以用于数组和集合的遍历。之所以能够工作,是因为Java SE5引入了新的被称为Iterable的接口,该接口中包含一个能够产生Iterator的iterator()方法,并且Iterable接口被foreach用来在序列中移动。因此如果你创建了任何实现Iterable的类,都可以将它用于foreach语句中。 ——Java编程思想第4版 第11章 243页

      1.任何实现了Iterable接口的类都可以用于foreach语句当中。

     1 //: holding/IterableClass.java
     2 // Anything Iterable works with foreach.
     3 import java.util.*;
     4 
     5 public class IterableClass implements Iterable<String> {
     6   protected String[] words = ("And that is how " +
     7     "we know the Earth to be banana-shaped.").split(" ");
     8   public Iterator<String> iterator() {
     9     return new Iterator<String>() {
    10       private int index = 0;
    11       public boolean hasNext() {
    12         return index < words.length;
    13       }
    14       public String next() { return words[index++]; }
    15       public void remove() { // Not implemented
    16         throw new UnsupportedOperationException();
    17       }
    18     };
    19   }    
    20   public static void main(String[] args) {
    21     for(String s : new IterableClass())
    22       System.out.print(s + " ");
    23   }
    24 } /* Output:
    25 And that is how we know the Earth to be banana-shaped.
    26 *///:~

      2.foreach实现原理:foreach语句最终被编译器转换成对iterator.next()和iterator.hashNext()方法的调用,也就是对Iterator的另一种封装形式而已。只是作为使用者,jdk屏蔽了这些实现细节。我们甚至不知道Iterator的存在。看编译生成的字节码:

      Java代码:

     1 import java.util.*;
     2 public class Iterable_eros {
     3 
     4     public static void main(String[] args) {
     5         List<String> strings = null;
     6         for(String s : strings){
     7         }
     8     }
     9     
    10 }

       Javap -c 生成的字节码:

     1 Compiled from "Iterable_eros.java"
     2 public class Iterable_eros {
     3   public Iterable_eros();
     4     Code:
     5        0: aload_0
     6        1: invokespecial #1                  // Method java/lang/Object."<init>":
     7 ()V
     8        4: return
     9 
    10   public static void main(java.lang.String[]);
    11     Code:
    12        0: aconst_null
    13        1: astore_1
    14        2: aload_1
    15        3: invokeinterface #2,  1            // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
    16        8: astore_2
    17        9: aload_2
    18       10: invokeinterface #3,  1            // InterfaceMethod java/util/Iterator.hasNext:()Z
    19       15: ifeq          31
    20       18: aload_2
    21       19: invokeinterface #4,  1            // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
    22       24: checkcast     #5                  // class java/lang/String
    23       27: astore_3
    24       28: goto          9
    25       31: return
    26 }

     

     

    加油
  • 相关阅读:
    asp.net控件开发基础(17)
    AjaxControlToolkit更新
    asp.net控件开发基础(18)
    asp.net控件开发基础(15)
    新装了vista,不容易啊
    asp.net控件开发基础(19)
    Oracle创建用户及数据表
    RMAN快速入门指南
    Oracle数据库中sql基础
    PL/SQL循序渐进全面学习教程Oracle
  • 原文地址:https://www.cnblogs.com/boothsun/p/4855368.html
Copyright © 2011-2022 走看看