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

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

    • boolean hasNext()

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

    • Object[next()

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

    • void remove()

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

      接下来通过“租车系统”讲解集合中Iterator迭代器的使用。

      (1)系统里可以有若干辆轿车和卡车供用户租用。

      (2)系统管理员可以遍历这个系统里所有的车辆。

      (3)遍历时是轿车,则显示轿车品牌,是卡车,则显示卡车吨位,同时完整显示车辆信息。

      根据需求编写如下代码:

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


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

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

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

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

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

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

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