3.4 Iterator迭代器
在TestTreeSet2代码中,使用了Iterator迭代器进行循环输出。那么什么是Iterator迭代器,有什么用以及如何使用,这些将是本节要解决的问题。
3.4.1 Iterator接口方法
前面学习的Collection接口、Set接口和List接口,它们的实现类都没有提供遍历集合元素的方法,Iterator迭代器为集合而生,是Java语言解决集合遍历的一个工具。它提供一种方法访问集合中各个元素,而不暴露该集合的内部实现细节。
Collection接口的iterator()方法返回一个Iterator对象,通过Iterator接口的两个方法即可实现对集合元素的遍历。下面列举了Iterator接口的三个方法。
- boolean hasNext()
判断是否存在下一个可访问的数据元素。
- Object[next()
返回要访问的下一个数据元素。
- void remove()
从迭代器指向的collection集合中移除迭代器返回的最后一个数据元素。
3.4.2 Iterator使用
接下来通过“租车系统”讲解集合中Iterator迭代器的使用。
假设“租车系统”有如下的需求调整:
(1)系统里可以有若干辆轿车和卡车供用户租用。
(2)系统管理员可以遍历这个系统里所有的车辆。
(3)遍历时是轿车,则显示轿车品牌,是卡车,则显示卡车吨位,同时完整显示车辆信息。
根据需求编写如下代码:
import java.util.*;
import com.bd.zuche.*;
class TestZuChe
{
public static void main(String[] args)
{
//创建HashSet集合,用于存放车辆
Set vehSet = new HashSet();
//创建2个轿车对象、2个卡车对象,并加入到HashSet集合中
Vehicle c1 = new Car("战神","长城");
Vehicle c2 = new Car("跑得快","红旗");
Vehicle t1 = new Truck("大力士","5吨");
Vehicle t2 = new Truck("大力士二代","10吨");
vehSet.add(c1);
vehSet.add(c2);
vehSet.add(t1);
vehSet.add(t2);
//使用迭代器循环输出
Iterator it = vehSet.iterator();
while (it.hasNext()) {
System.out.println("***显示集合中元素信息***");
Object obj = it.next();
if(obj instanceof Car)
{
Car car = (Car)obj;
//调用Car类的特有方法getBrand()
System.out.println("该车是轿车,其品牌为:" + car.getBrand());
}else{
Truck truck = (Truck)obj;
//调用Truck类的特有方法getLoad()
System.out.println("该车是卡车,其吨位为:" + truck.getLoad());
}
//调用Vehicle类方法show()
((Vehicle)obj).show();
}
}
}
在该段代码中,通过Iterator接口的hasNext()方法判断集合中是否还有对象元素,再通过该接口的next()方法获取这个对象元素。然后通过instanceof运算符,判断这个对象元素是轿车还是卡车,并显示轿车品牌或卡车吨位,最后调用这两个类共有的show()方法显示车辆全部信息。编译、运行上面的代码,程序运行结果如图3.6所示。
图3.6 Iterator迭代器的使用
3.4.3 增强for循环
从JDK1.5开始,提供了另一种形式的for循环,这就是增强for循环,或称为foreach循环。借助增强for循环,可以用更简单的方式来遍历数组和Collection集合中的对象。
下面用增强for循环与传统for循环做个比较。举一个非常简单的案例,一个数组(或集合)中存了四个学生的姓名字符串,分别用传统for循环和增强for循环,逐个显示学生姓名,具体代码如下:
import java.util.*;
public class TestForEach
{
public static void main(String[] args)
{
String[] stuArr = {"王云","刘静涛","南天华","雷静"};
//传统for循环遍历
for(int i = 0;i < stuArr.length;i++){
System.out.println(stuArr[i]);
}
//增强for循环遍历
for(String stu:stuArr){
System.out.println(stu);
}
Set nameSet = new HashSet();
nameSet.add("王云");
nameSet.add("刘静涛");
nameSet.add("南天华");
nameSet.add("雷静");
//迭代器遍历
Iterator it = nameSet.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
//增强for循环遍历
for(Object stu2:nameSet){
System.out.println((String)stu2);
}
}
}
通过代码可以看出,JDK1.5的增强for循环使得代码短小且精炼,在遍历数组和集合的情况下,更加方便。
但增强for循环在使用时,也有下面一些局限性,使用时需要注意。
(1)在用传统for循环处理数组时,可以通过数组下标进行一些程序控制,例如可以通过数组下标每次循环之后加2的方式,间隔输出数组中的元素。而增强for循环不能获得下标位置,类似的功能需要用其他方式实现。
(2)如果使用增强for循环操作集合,无法实现对集合元素的删除,还是需要调用Iterator迭代器的remove()方法才能完成。