foreach与迭代器

来源:互联网 发布:stc52单片机引脚功能 编辑:程序博客网 时间:2024/06/02 06:25

1.foreach语法是适用于数组和Iterable的。foreach语法实现原理可以参考:http://blog.csdn.net/raylee2007/article/details/50951357

容器之所以可以用于foreach,是因为容器默认实现了Iterable接口,而该接口包含的iterator()方法能够产生Iterator对象(迭代器)。

如下例,C是容器类,可以直接用于foreach语法中:

import java.util.*;public class Test3{public static void main(String[] args){Collection<Integer> c = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));for(Integer i : c){System.out.println(i);}}}


2.一个类只要实现了Iterable接口,覆盖了它的iterator()方法从而生成Iterator对象,就能像容器一样用于foreach语法。

如下例,Test2继承Iterable接口,并覆盖了该接口的iterator()方法,该方法返回的是继承了Iterator的匿名内部类,该内部类实现了Iterator的3个方法:hasNext()、next()、remove()。那么Test2类的对象就能直接用于foreach语法了。(foreach语法里遍历的就是next()返回的内容)

import java.util.*;public class Test2 implements Iterable<String>{String[] s = {"i ","am ","xyy"};public Iterator<String> iterator(){return new Iterator<String>(){int count;public boolean hasNext(){return count<s.length;}public String next(){return s[count++];}public void remove(){throw new UnsupportedOperationException();}};}public static void main(String[] args){Test2 t =new Test2();for(String s:t){System.out.print(s);}}}


3.依上所述,让一个类适用于foreach语法的方法是让该类继承Iterable接口,能用该接口的iterator()方法产生迭代器;而不是这个类直接继承Iterator使自身成为一个迭代器

下面的Test1就是一个类直接继承Iterator的例子,这个类不能用于foreach语法,注释行如果运行会报错如下:

Test1.java:20: 错误: for-each 不适用于表达式类型
                for(Test1 tt : t){}
                               ^
  要求: 数组或 java.lang.Iterable

import java.util.*;public class Test1 implements Iterator<String>{String[] s = {"i ","am ","xyy"};int count;public boolean hasNext(){return count<s.length;}public String next(){return s[count++];}public void remove(){throw new UnsupportedOperationException();}public static void main(String[] args){Test1 t = new Test1();while(t.hasNext()){System.out.print(t.next());}//for(Test1 tt : t){}}}

由于Test1这个类是直接继承了Iterator,虽不能用于foreach语法,但可以直接调用覆盖后的hasNext()方法来达到遍历的目的。





原创粉丝点击