论坛首页 入门技术论坛

JAVA基础:迭代与迭代器

浏览 4826 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-12-13  
    while,do-while和for用来控制循环,有时将它们划分为"迭代语句".语句会重复执行,直到起控制作用的布尔表达式(Boolean-expression)得到"假"的结果为止.

    迭代器(也是一种设计模式)的概念可以用于达成不重写代码就可以应用于不同类型的容器.迭代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构(也就是不同容器的类型).此外,迭代器通常被称为"轻量级"对象:创建它的代价小.

    Java的Iterator就是一种迭代器(只能单向移动),它只能用来:
        1,使用方法iterator()要求容器返回一个Iterator.第一次调用Iterator的next()方法时,它返回序列的第一个元素;
        2,使用next()获得序列中的下一个元素;
        3,使用hasNext()检查序列中是否还有元素;
        4,使用remove()将迭代器新近返回的元素删除.

package iterator;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/*
 * 通用的迭代器;
 * 将遍历一个序列的操作与此序列底层结构相分离;
 * 因为Iterator隐藏了容器底层的结构,所以,IteratorAll.printAll并不知道,也不关心此Iterator是从何容器而来;
 * 取得一个对象容器,遍历容器以对每个对象执行动作;
 * 该方法间接使用了Object.toString()方法,因为更具通用性;
 */
class IteratorAll {
	static void printAll(Iterator e) {
		while (e.hasNext()) {
			System.out.println("\t" + e.next());
			/*
			 * 虽然不必要,但仍然可以明确地进行类型转换,效果与调用toString()相同;
			 * System.out.println("\t" + (Integer)e.next());
			 * 通常Object提供的方法并不能满足需求,所以又要考虑类型转换的问题,
			 * 必须假设你已经取得了某个特定类型的序列的Iterator,并将对结果对象做类型转换(如果类型错误会得到一个运行时异常).
			 */
		}
	}
}

/*
 * 创建两种不同的容器,一个ArrayList和一个HashMap,均使用Integer填充
 */
public class IteratorDemo {
	public static void main(String[] args) {
		// 创建ArrayList,并填充Integer类型
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			list.add(i);
		}
		// 创建HashMap,并填充Integer类型
		Map<Integer, Integer> map = new HashMap<Integer, Integer>();
		for (int i = 0; i < 10; i++) {
			map.put(i, i);
		}
		System.out.println("List");
		// 调用上面的通用迭代器,打印ArrayList
		IteratorAll.printAll(list.iterator());
		System.out.println("Map");
		// 对HashMap而言,entrySet()方法生成一个由Map.entry对象组成的Set,Map.entry对象包含映射中每个元素的"键"和"值"
		// 调用上面的通用迭代器,打印HashMap
		IteratorAll.printAll(map.entrySet().iterator());
	}
}
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics