接口Iterable 和接口Iterator 是两个相关联的接口。
接口Iterable 为所有Collection 集合的遍历定义了抽象方法iterator(),它的返回值是Iterator 接口类型;
而接口Iterator 是一个迭代工具。迭代器Iterator 可以实现对Collection 集合的迭代访问,即可以很方便地访问Collection 集合中的每一个元素。
Collection 接口提供了一个iterator() 方法,用于获取集合中所有元素的迭代器,可以用此对象依次访问集合中的元素。
重复调用next() 方法即可依次访问Collection 集合中的元素,并在访问到达集合尾部时,抛出NosuchElementExceptioin 异常。
因此,调用next() 方法前应先调用hasNext()方法判断集合中是否还有下一个元素未访问,如果还有此迭代器未访问到的元素,hasNext() 方法返回true,否则返回false。
如果需要访问集合中的所有元素,在满足hasNext() 返回true 的条件下,使用对应的Iterator 对象反复调用next() 方法,即可实现对所有元素的遍历,代码模板如下:
//先定义Collection 集合对象coll
Iterator iter = coll.iterator();
while (iter.hasNext()){
Object ob = iter.next(); //对ob 的操作
}
对于Collection 集合,可包含重复元素,并且元素是有顺序的。List 集合是一组允许重复且有序的元素,通过元素的index 值(标明该元素在列表中的位置)来查找该元素。
Set 集合不允许重复,并且对象之间没有指定的顺序。Queue 集合用于模拟队列这种数据结构,遵循“先进先出”的原则,不允许随机访问队列中的元素。
对Map 集合遍历时,先得到键名的Set 集合,再对Set 集合进行遍历,得到相应的键值(即键名key 到键值value 的映射),其代码模板如下:
//先定义Map 集合对象map
Set<String> ks = map.keySet(); //假定Map 集合里键名类型为String,生成Set 集合
for (String key : keySet) {
//根据键名得到键值
System.out.println("key= " + key + " and value= " + map.get(key));
}
// 也可使用Collection 集合通用的迭代器进行迭代
注意:自JDK 1.5 版本之后,Iterator 的应用逐渐淡出,取而代之的是for 或foreach(for 的简化版本)。
遍历Map 集合的另一种方式是,先得到Map 映射项(是键名和键值的统一体)的Set 集合,再得到相应的键名的Set 集合,进而遍历Map 集合。