3.3 Iterator迭代器

  在TestTreeSet2代码中,使用了Iterator迭代器进行循环输出。那么什么是Iterator迭代器,有什么用以及如何使用,这些将是本节要解决的问题。

3.3.1 Iterator接口方法

  前面学习的Collection接口、Set接口和List接口,它们的实现类都没有提供遍历集合元素的方法,Iterator迭代器为集合而生,是Java语言解决集合遍历的一个工具。它提供一种方法访问集合中各个元素,而不暴露该集合的内部实现细节。

  Collection接口的iterator()方法返回一个Iterator对象,通过Iterator接口的两个方法即可实现对集合元素的遍历。下面列举了Iterator接口的三个方法。

  • boolean hasNext()

  判断是否存在下一个可访问的数据元素。

  • Object[next()

  返回要访问的下一个数据元素。

  • void remove()

  从迭代器指向的collection集合中移除迭代器返回的最后一个数据元素。

3.3.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();

​                  }

​         }

}
copy

  在该段代码中,通过Iterator接口的hasNext()方法判断集合中是否还有对象元素,再通过该接口的next()方法获取这个对象元素。然后通过instanceof运算符,判断这个对象元素是轿车还是卡车,并显示轿车品牌或卡车吨位,最后调用这两个类共有的show()方法显示车辆全部信息。编译、运行上面的代码,程序运行结果如图3.6所示。

图3.6 Iterator迭代器的使用

3.3.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);

​                  }

​         }

}
copy

  通过代码可以看出,JDK1.5的增强for循环使得代码短小且精炼,在遍历数组和集合的情况下,更加方便。

  但增强for循环在使用时,也有下面一些局限性,使用时需要注意。

  (1)在用传统for循环处理数组时,可以通过数组下标进行一些程序控制,例如可以通过数组下标每次循环之后加2的方式,间隔输出数组中的元素。而增强for循环不能获得下标位置,类似的功能需要用其他方式实现。

  (2)如果使用增强for循环操作集合,无法实现对集合元素的删除,还是需要调用Iterator迭代器的remove()方法才能完成。