java中Collection迭代器的实现

 更新时间:2026年01月13日 09:41:04   作者:专注于大数据技术栈  
Java迭代器是遍历Collection集合的标准工具,提供hasNext()、next()和remove()三个核心方法,下面就来介绍一下Collection迭代器的实现,感兴趣的可以了解一下

一、迭代器(Iterator)是什么?

Iterator 是 Java 集合框架中专门用于遍历 Collection 集合元素的接口(位于 java.util 包下),它为所有实现 Collection 接口的集合(如 ArrayList、HashSet 等)提供了统一的遍历方式

你可以把迭代器理解为一个 “集合的专属遍历工具”:它就像一个指针,一开始指向集合第一个元素的 “前面”,通过调用方法可以逐个移动指针、获取元素,而且能安全地在遍历过程中删除元素(这是普通 for 循环做不到的)。

二、Iterator 的核心方法

Iterator 接口只有 3 个核心方法,简单且易记:

方法作用
boolean hasNext()判断当前指针后面是否还有元素,有则返回 true,无则返回 false
E next()① 将指针向后移动一位 ② 返回当前指针指向的元素
void remove()删除上一次调用 next () 时返回的元素(遍历中安全删除元素的关键)

三、Iterator 的基本使用步骤(核心)

使用迭代器遍历 Collection 集合的固定步骤:

  1. 通过 Collection 的 iterator() 方法获取迭代器对象;
  2. 用 hasNext() 判断是否还有下一个元素;
  3. 用 next() 获取下一个元素;
  4. (可选)用 remove() 删除当前元素。

完整使用示例

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
 
public class IteratorDemo {
    public static void main(String[] args) {
        // 1. 创建集合并添加元素
        Collection<String> list = new ArrayList<>();
        list.add("苹果");
        list.add("香蕉");
        list.add("橙子");
        list.add("葡萄");
 
        // 2. 获取迭代器对象
        Iterator<String> it = list.iterator();
 
        // 3. 遍历集合
        System.out.println("遍历并输出所有元素:");
        while (it.hasNext()) { // 判断是否有下一个元素
            String fruit = it.next(); // 移动指针并获取元素
            System.out.println(fruit);
 
            // 4. 可选:遍历中删除指定元素(比如删除"香蕉")
            if ("香蕉".equals(fruit)) {
                it.remove(); // 安全删除,不会触发并发修改异常
            }
        }
 
        // 遍历结束后查看集合
        System.out.println("\n删除香蕉后的集合:" + list); // 输出:[苹果, 橙子, 葡萄]
    }
}

四、迭代器的关键注意事项(避坑重点)

调用 next () 前必须先调用 hasNext ()如果指针已经到集合末尾,直接调用 next() 会抛出 NoSuchElementException(无此元素异常),这是新手最容易犯的错误。

遍历过程中不能用集合的 remove () 方法如果在迭代器遍历期间,直接调用 collection.remove()(而非 it.remove()),会触发 ConcurrentModificationException(并发修改异常)。因为迭代器会检测集合的 “修改次数”,一旦发现迭代器之外的修改,就会报错。

// 错误示例:遍历中直接用集合的 remove 方法
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String fruit = it.next();
    if ("香蕉".equals(fruit)) {
        list.remove(fruit); // 抛出 ConcurrentModificationException
    }
}

remove () 必须在 next () 之后调用如果先调用 it.remove() 再调用 it.next(),或者连续调用两次 it.remove(),会抛出 IllegalStateException(非法状态异常)。因为 remove() 只能删除 “上一次 next () 获取的元素”,没有 next () 就没有可删除的元素。

迭代器遍历是单向的迭代器只能从前往后遍历,一旦遍历到末尾,无法回头重新遍历,除非重新获取一个新的迭代器对象。

五、增强 for 循环(foreach)与迭代器的关系

你平时用的增强 for 循环(for (元素类型 变量 : 集合))本质上是迭代器的语法糖,编译器会自动将其编译为迭代器遍历的代码。比如:

// 增强 for 循环遍历
for (String fruit : list) {
    System.out.println(fruit);
}
 
// 编译器编译后等价于:
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String fruit = it.next();
    System.out.println(fruit);
}

⚠️ 注意:增强 for 循环同样不能在遍历中直接修改集合(比如删除元素),否则也会抛出 ConcurrentModificationException

总结

  1. Iterator 是遍历 Collection 集合的标准工具,提供 hasNext()next()remove() 三个核心方法,保证遍历的统一性和安全性。
  2. 迭代器使用的核心规则:先 hasNext() 判断,再 next() 获取,遍历中删除元素必须用 it.remove() 而非集合的 remove()
  3. 增强 for 循环是迭代器的语法糖,本质相同,但无法手动调用 remove(),遍历中修改集合仍会报错。

 到此这篇关于java中Collection迭代器的实现的文章就介绍到这了,更多相关java Collection迭代器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RocketMQ broker文件清理源码解析

    RocketMQ broker文件清理源码解析

    这篇文章主要为大家介绍了RocketMQ broker文件清理源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java源码难点突破Lambda表达式执行原理

    Java源码难点突破Lambda表达式执行原理

    这篇文章主要为大家介绍了Java难点突破Lambda表达式执行原理分析及示例的实现源码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • JavaWeb中Tomcat底层机制和Servlet运行原理详解

    JavaWeb中Tomcat底层机制和Servlet运行原理详解

    这篇文章主要介绍了JavaWeb中Tomcat底层机制和Servlet运行原理详解,Tomcat是一个开源的Java Web服务器,它是基于Java Servlet和JavaServer Pages(JSP)技术的,下面是关于Tomcat底层机制和Servlet运行原理的简要说明,需要的朋友可以参考下
    2023-10-10
  • Spring AOP配置文件方式入门教程详解

    Spring AOP配置文件方式入门教程详解

    spring aop是一个面向切面的编程,在自己第一遍学习的时候,感觉aop没有什么作用,但是真实接触下来,感觉spring aop还是很有用途的,这篇文章主要介绍了Spring AOP配置文件方式入门教程的相关资料,需要的朋友可以参考下
    2025-11-11
  • MyBatis Example And与Or混合使用的实例

    MyBatis Example And与Or混合使用的实例

    这篇文章主要介绍了MyBatis Example And与Or混合使用的实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Spring AOP的注解实现方式实例详解

    Spring AOP的注解实现方式实例详解

    AOP是一种对某一类事情集中处理的思想,本文给大家介绍Spring AOP的注解实现方式实例详解,感兴趣的朋友一起看看吧
    2025-04-04
  • Java使用开源Rxtx实现串口通讯

    Java使用开源Rxtx实现串口通讯

    这篇文章主要为大家详细介绍了Java使用开源Rxtx实现串口通讯,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Java 获取当前系统时间的三种方法

    Java 获取当前系统时间的三种方法

    这篇文章主要介绍了Java 获取当前系统时间的三种方法,帮助大家利用Java处理时间,感兴趣的朋友可以了解下
    2020-10-10
  • @PathVariable获取路径中带有 / 斜杠的解决方案

    @PathVariable获取路径中带有 / 斜杠的解决方案

    这篇文章主要介绍了@PathVariable获取路径中带有 / 斜杠的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Spring Data Jpa框架最佳实践示例

    Spring Data Jpa框架最佳实践示例

    这篇文章主要为大家介绍了Spring Data Jpa框架最佳实践示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-02-02

最新评论