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)遍历时是轿车,则显示轿车品牌,是卡车,则显示卡车吨位,同时完整显示车辆信息。

  根据需求编写如下代码:

  1. import java.util.*;
  2. import com.bd.zuche.*;
  3. class TestZuChe
  4. {
  5. public static void main(String[] args)
  6. {
  7. //创建HashSet集合,用于存放车辆
  8. Set vehSet = new HashSet();
  9. //创建2个轿车对象、2个卡车对象,并加入到HashSet集合中
  10. Vehicle c1 = new Car("战神","长城");
  11. Vehicle c2 = new Car("跑得快","红旗");
  12. Vehicle t1 = new Truck("大力士","5吨");
  13. Vehicle t2 = new Truck("大力士二代","10吨");
  14. vehSet.add(c1);
  15. vehSet.add(c2);
  16. vehSet.add(t1);
  17. vehSet.add(t2);
  18. //使用迭代器循环输出
  19. Iterator it = vehSet.iterator();
  20. while (it.hasNext()) {
  21. System.out.println("***显示集合中元素信息***");
  22. Object obj = it.next();
  23. if(obj instanceof Car)
  24. {
  25. Car car = (Car)obj;
  26. //调用Car类的特有方法getBrand()
  27. System.out.println("该车是轿车,其品牌为:" + car.getBrand());
  28. }else{
  29. Truck truck = (Truck)obj;
  30. //调用Truck类的特有方法getLoad()
  31. System.out.println("该车是卡车,其吨位为:" + truck.getLoad());
  32. }
  33. //调用Vehicle类方法show()
  34. ((Vehicle)obj).show();
  35. }
  36. }
  37. }

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

3.4 Iterator迭代器 - 图1


图3.6 Iterator迭代器的使用

3.4.3 增强for循环

  从JDK1.5开始,提供了另一种形式的for循环,这就是增强for循环,或称为foreach循环。借助增强for循环,可以用更简单的方式来遍历数组和Collection集合中的对象。

  下面用增强for循环与传统for循环做个比较。举一个非常简单的案例,一个数组(或集合)中存了四个学生的姓名字符串,分别用传统for循环和增强for循环,逐个显示学生姓名,具体代码如下:

  1. import java.util.*;
  2. public class TestForEach
  3. {
  4. public static void main(String[] args)
  5. {
  6. String[] stuArr = {"王云","刘静涛","南天华","雷静"};
  7. //传统for循环遍历
  8. for(int i = 0;i < stuArr.length;i++){
  9. System.out.println(stuArr[i]);
  10. }
  11. //增强for循环遍历
  12. for(String stu:stuArr){
  13. System.out.println(stu);
  14. }
  15. Set nameSet = new HashSet();
  16. nameSet.add("王云");
  17. nameSet.add("刘静涛");
  18. nameSet.add("南天华");
  19. nameSet.add("雷静");
  20. //迭代器遍历
  21. Iterator it = nameSet.iterator();
  22. while (it.hasNext()){
  23. System.out.println(it.next());
  24. }
  25. //增强for循环遍历
  26. for(Object stu2:nameSet){
  27. System.out.println((String)stu2);
  28. }
  29. }
  30. }

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

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

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

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