Java——Iterator迭代器

本文深入解析Java中的迭代器(Iterator)设计模式,介绍其基本功能和操作方法,如使用iterator()、next()、hasNext()及remove()等,并对比Iterator与ListIterator的不同,通过实例演示迭代器在遍历和操作集合中的应用。

迭代器(Iterator)

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

java中的Iterator功能比较简单,并且只能单向移动:

  (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回

序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

  (2) 使用next()获得序列中的下一个元素。

  (3) 使用hasNext()检查序列中是否还有元素。

  (4) 使用remove()将迭代器新返回的元素删除。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

迭代器应用:

public static void main(String[] args) {
        List l = new ArrayList();
        
        l.add("aa");
        l.add("bb");
        l.add("cc");
        
        for (Iterator iter = l.iterator(); iter.hasNext();) {
            String str = (String) iter.next();
            System.out.println(str);
        }
        // 迭代器用于while循环
        Iterator iter = l.iterator();
        while (iter.hasNext()) {
            String str = (String) iter.next();
            System.out.println(str);
        }

    }

使用next()获得序列中的下一个元素:迭代器intertor开始指向索引号为0的位置,使用next()函数后指向下一个元素,即原指引号为1的元素(第一个元素,这说明interor开始并没有指向集合中的任何元素),返回原指引号为1的元素,此时原指引号为1元素的指引号变为0,依次向下执行。

add()函数:在迭代器intertor指向的索引位置添加元素。

remove函数:在迭代器intertor指向的索引位置删除元素。

    public static void main(String[] args) {
        
        ArrayList<Integer> array = new ArrayList<Integer>();
        Collections.addAll(array, 1, 2, 3, 4, 5, 6);
        System.out.println(array);
        ListIterator<Integer> intertor = array.listIterator();// 使用无参数的方法获得ListIntertor对象
        boolean hasnext = intertor.hasNext();
        System.out.println("集合是否具有下一个元素:" + hasnext);
        boolean hasprevious = intertor.hasPrevious();
        System.out.println("集合是否具有前一个元素:" + hasprevious);
        int next = intertor.next();
        System.out.println("获得下一个元素:" + next);
        int nextIndex = intertor.nextIndex();
        System.out.println("获得集合的下一个元素的索引:" + nextIndex);
        int previous = intertor.previous();
        System.out.println("获得前一个元素:" + previous);
        int nextPrevious = intertor.previousIndex();
        System.out.println("获得集合的上一个元素的索引:" + nextPrevious);
        intertor.add(7);
        System.out.println("向集合中增加元素7后的集合:" + array);
        intertor.add(3);
        System.out.println("向集合中增加元素3后的集合:" + array);
        intertor.next();
        intertor.set(12);
        System.out.println("下一个元素修改为12后的集合:" + array);
        intertor.remove();
        System.out.println("下一个元素删除后的集合为:" + array);
    }

执行结果:

[1, 2, 3, 4, 5, 6]
集合是否具有下一个元素:true
集合是否具有前一个元素:false
获得下一个元素:1
获得集合的下一个元素的索引:1
获得前一个元素:1
获得集合的上一个元素的索引:-1
向集合中增加元素7后的集合:[7, 1, 2, 3, 4, 5, 6]
向集合中增加元素3后的集合:[7, 3, 1, 2, 3, 4, 5, 6]
下一个元素修改为12后的集合:[7, 3, 12, 2, 3, 4, 5, 6]
下一个元素删除后的集合为:[7, 3, 2, 3, 4, 5, 6]

### Java Iterator 迭代器源码解析 #### 1. `Iterator` 接口定义 `Iterator` 是一个接口,位于 `java.util` 包下。该接口提供了遍历集合元素的方法,并允许安全地移除元素而不抛出并发修改异常。 ```java public interface Iterator<E> { boolean hasNext(); E next(); void remove(); // 可选操作 } ``` 此接口中的三个主要方法用于控制迭代过程[^1]。 #### 2. `ArrayList` 的内部类 `Itr` 当创建 `ArrayList` 对象并调用其 `iterator()` 方法时,实际上会实例化一个名为 `Itr` 的私有内部类的对象。这个类实现了 `Iterator` 接口,并维护了一些重要的字段来跟踪当前的位置以及检测结构变化: - `cursor`: 下一次调用 `next()` 返回的索引位置。 - `lastRet`: 上次返回元素的索引;如果尚未调用过,则为 `-1`。 - `expectedModCount`: 记录列表预期的修改次数,用来判断是否有其他线程正在修改列表。 这些变量共同作用以确保迭代过程中的一致性和安全性。 #### 3. 并发修改检查机制 (`checkForComodification`) 为了防止在迭代期间发生意外的数据损坏或不一致状态,每当执行某些可能改变集合大小的操作(如添加、删除),都会增加 `modCount` 字段的值。而在每次调用 `next()` 或者 `remove()` 后,`Itr` 类都会通过比较实际的 `modCount` 和期望的 `expectedModCount` 来验证两者是否相等。如果不匹配,则意味着存在未授权的更改行为,此时便会抛出 `ConcurrentModificationException` 异常作为警告[^3]。 #### 4. 完整示例代码展示如何正确使用 `Iterator` 下面是一个完整的例子展示了怎样利用 `Iterator` 遍历 `ArrayList` 中的内容而不会触发上述提到的异常情况: ```java import java.util.*; public class Demo2 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); // 添加多个字符串到列表中 list.add("计算机网络"); list.add("现代操作系统"); list.add("Java编程思想"); list.add("Java核心技术"); list.add("Java语言程序设计"); System.out.println("原始列表:" + list); // 使用增强for循环打印所有项 for (String item : list) { System.out.println(item); } // 正确的方式:先获取迭代器再进行迭代 Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String element = iterator.next(); System.out.println(element); // 如果需要在此处移除某个特定条件下的元素, // 应该始终使用迭代器自己的remove()方法而不是list.remove() if ("Java编程思想".equals(element)) { iterator.remove(); // 安全地移除了该项 } } System.out.println("处理后的列表:" + list); } } ``` 这段代码不仅演示了标准的迭代模式,还强调了一个重要原则——即只有当确实有必要时才应该尝试从集合内删除项目,并且务必采用由相应迭代器所提供的专用 `remove()` 函数来进行这一操作[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值