foreach与迭代器

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()方法来达到遍历的目的。





  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值