当前位置: 首页 / 技术干货 / 正文
Iterator接口介绍

2022-12-15

集合 元素 代器 iterator

  Iterator接口介绍

  在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,Java专门提供了一个接口Iterator。Iterator接口也是集合中的一员,但它与Collection、Map接口有所不同。Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。

  接下来通过一个案例学习如何使用Iterator迭代集合中的元素。

Java
import java.util.ArrayList;
import java.util.Iterator;

public class Example03 {
    public static void main(String[] args) {
        ArrayList list = new ArrayList(); // 创建ArrayList集合
        list.add("张三"); // 向该集合中添加字符串
        list.add("李四");
        list.add("王五");
        list.add("赵六");
        Iterator it = list.iterator(); // 获取Iterator对象
        while (it.hasNext()) { // 判断ArrayList集合中是否存在下一个元素
            Object obj = it.next(); // 取出ArrayList集合中的元素
            System.out.println(obj);
        }
    }
}

  当遍历元素时,首先通过调用ArrayList集合的iterator()方法获得迭代器对象;然后使用hasNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已到达了集合末尾,停止遍历元素。需要注意的是,在通过next()方法获取元素时,必须保证要获取的元素存在,否则,会抛出NoSuchElementException异常。

  Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,为了让初学者能更好地理解迭代器的工作原理,接下来通过一个图例演示Iterator对象迭代元素的过程。

图片18

  上图中,在调用Iterator的next()方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next()方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next()方法时,迭代器的索引会指向第二个元素并将该元素返回,以此类推,直到hasNext()方法返回false,表示到达了集合的末尾,终止对元素的遍历。

  通过迭代器获取ArrayList集合中的元素时,这些元素的类型都是Object类型,如果想获取到特定类型的元素,则需要进行对数据类型强制转换。

  并发修改异常

  在使用Iterator迭代器对集合中的元素进行迭代时,如果调用了集合对象的remove()方法去删除元素之后,继续使用迭代器遍历元素,会出现异常。接下来通过一个案例演示这种异常。假设在一个集合中存储了学校所有学生的姓名,由于一个名为“张三”的学生中途转学,这时就需要在迭代集合时找出该元素并将其删除,具体代码如下。


import java.util.ArrayList;
import java.util.Iterator;

public class Example04 {
    public static void main(String[] args) {
        ArrayList list = new ArrayList(); // 创建ArrayList集合
        list.add("张三");
        list.add("李四");
        list.add("王五");
        Iterator it = list.iterator(); // 获得Iterator对象
        while (it.hasNext()) { // 判断该集合是否有下一个元素
            Object obj = it.next(); // 获取该集合中的元素
            if ("张三".equals(obj)) { // 判断该集合中的元素是否为张三
                list.remove(obj); // 删除该集合中的元素
            }
        }
        System.out.println(list);
    }
}

  上述程序在运行时出现了并发修改异常ConcurrentModificationException。这个异常是迭代器对象抛出的,出现异常的原因是集合在迭代器运行期间删除了元素,会导致迭代器预期的迭代次数发生改变,导致迭代器的结果不准确。

图片19

  要解决上述问题,可以采用两种方式,下面分别介绍。

  第一种方式:从业务逻辑上讲只想将姓名为“张三”的学生删除,至于后面还有多少学生并不需要关心,只需找到该学生后跳出循环不再迭代即可,也就是在第12行代码下面增加一个break语句,代码如下:  

Java
if ("张三".equals(obj)) {
        list.remove(obj);
        break;
}

  第二种方式:如果需要在集合的迭代期间对集合中的元素进行删除,可以使用迭代器本身的删除方法,将第12行代码替换成it.remove()即可解决这个问题:  

Java
if ("张三".equals(obj)) {
        it.remove();
}

   由运行结果可知,学员“张三”确实被删除了,并且没有出现异常。因此可以得出结论,调用迭代器对象的remove()方法删除元素所导致的迭代次数变化,对于迭代器对象本身来讲是可预知的。

分享: 更多

上一篇:LinkedList集合

下一篇:foreach循环介绍

好程序员公众号

  • · 剖析行业发展趋势
  • · 汇聚企业项目源码

好程序员开班动态

More+
  • HTML5大前端 <高端班>

    开班时间:2021-04-12(深圳)

    开班盛况

    开班时间:2021-05-17(北京)

    开班盛况
  • 大数据+人工智能 <高端班>

    开班时间:2021-03-22(杭州)

    开班盛况

    开班时间:2021-04-26(北京)

    开班盛况
  • JavaEE分布式开发 <高端班>

    开班时间:2021-05-10(北京)

    开班盛况

    开班时间:2021-02-22(北京)

    开班盛况
  • Python人工智能+数据分析 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2020-09-21(上海)

    开班盛况
  • 云计算开发 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2019-07-22(北京)

    开班盛况
IT培训IT培训
在线咨询
IT培训IT培训
试听
IT培训IT培训
入学教程
IT培训IT培训
立即报名
IT培训

Copyright 2011-2023 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公网安备 11010802035720号