Java iterator常见用法

 更新时间:2025年04月30日 16:48:01   作者:飞滕人生TYF  
Iterator 是 Java 集合框架中最常用的遍历工具,适用于所有集合类型,它提供了简单、安全的遍历方式,同时支持动态删除操作,本文给大家介绍Java iterator 详解,感兴趣的朋友一起看看吧

在 Java 中,Iterator 是一种用于遍历集合(如 ListSet)的通用工具。它提供了一种统一的方式来访问集合中的元素,同时隐藏了集合的具体实现。

以下是对 Java Iterator 的详解,包括其作用、常见用法、实现原理和注意事项。

1. Iterator 的作用

  • 提供一种通用的方式来遍历集合,而无需了解集合的内部实现。
  • 支持安全地在遍历过程中删除集合中的元素(通过 remove() 方法)。
  • 替代传统的索引遍历方式,避免代码与集合实现耦合。

2. Iterator 的常见方法

Iterator 接口定义在 java.util 包中,主要包含以下方法:

方法签名描述
boolean hasNext()判断集合中是否还有未访问的元素。
E next()返回集合中的下一个元素。
void remove()删除上次调用 next() 返回的元素(可选操作)。

3. 使用 Iterator 的步骤

示例代码

import java.util.*;
public class IteratorExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));
        // 获取 Iterator 对象
        Iterator<String> iterator = list.iterator();
        // 遍历集合
        while (iterator.hasNext()) {
            String element = iterator.next();
            System.out.println(element);
            // 删除元素示例
            if ("B".equals(element)) {
                iterator.remove(); // 删除元素 "B"
            }
        }
        System.out.println("After removal: " + list);
    }
}

输出:

A
B
C
D
After removal: [A, C, D]

4. Iterator 的实现原理

4.1 集合和 Iterator 的关系

  • 每个集合类(如 ArrayListHashSet)都有自己的 Iterator 实现。
  • 调用 iterator() 方法时,集合会返回其内部定义的 Iterator 对象。

4.2 内部维护的游标

  • Iterator 内部维护一个游标(指针),指向当前遍历的位置。
  • 调用 next() 时,游标移动到下一个位置并返回对应的元素。
  • 调用 remove() 时,删除游标所指向的元素。

5. 增强的遍历方式:for-each 循环

5.1 背景

  • for-each 循环是 Java 的语法糖,本质上依赖于集合的 Iterator
  • 适合只读遍历,不支持在遍历时修改集合。

代码示例

import java.util.*;
public class ForEachExample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("A", "B", "C", "D");
        for (String element : list) {
            System.out.println(element);
        }
    }
}

局限性

  • for-each 无法直接调用 Iterator.remove()
  • 适用于只读遍历,不适合需要动态修改集合的场景。

6. Iterator 的变种

6.1 ListIterator

  • 专用于 List 类型的集合,继承自 Iterator,提供了双向遍历和插入操作。
  • 常用方法:
    • boolean hasPrevious():判断是否有前一个元素。
      • E previous():返回前一个元素。
      • void add(E e):在当前游标位置插入元素。

示例代码

import java.util.*;
public class ListIteratorExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
        ListIterator<String> listIterator = list.listIterator();
        // 正向遍历
        while (listIterator.hasNext()) {
            System.out.println("Next: " + listIterator.next());
        }
        // 反向遍历
        while (listIterator.hasPrevious()) {
            System.out.println("Previous: " + listIterator.previous());
        }
    }
}

输出:

Next: A
Next: B
Next: C
Previous: C
Previous: B
Previous: A

6.2 Spliterator

  • Spliterator 是 Java 8 引入的新特性,专为支持并行遍历而设计。
  • 提供了分割操作(trySplit()),允许将集合分成多个部分,便于多线程处理。

示例代码

import java.util.*;
public class SpliteratorExample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("A", "B", "C", "D");
        Spliterator<String> spliterator = list.spliterator();
        // 遍历 Spliterator
        spliterator.forEachRemaining(System.out::println);
    }
}

7. 注意事项

7.1 修改集合时的并发问题

  • 如果在一个线程中使用 Iterator 遍历集合,同时另一个线程修改了集合,可能抛出 ConcurrentModificationException
  • 解决方案:
    • 使用并发集合(如 CopyOnWriteArrayListConcurrentHashMap)。
    • 使用显式同步(如 synchronized)。

7.2 遍历时删除元素

  • 必须使用 Iterator.remove() 方法删除当前元素,直接调用集合的 remove() 方法会抛出 ConcurrentModificationException
  • 错误示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
for (String element : list) {
    if ("B".equals(element)) {
        list.remove(element); // 错误:抛出 ConcurrentModificationException
    }
}

正确示例:

List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    if ("B".equals(iterator.next())) {
        iterator.remove(); // 正确
    }
}

8. 常见问题与解答

Q1: 为什么使用 Iterator

  • 隐藏集合的具体实现,统一遍历方式。
  • 提供安全的遍历和删除功能。

Q2: 什么是 ConcurrentModificationException

  • Iterator 遍历过程中,集合被结构性修改(如添加或删除元素)时,会抛出该异常。
  • 解决方案:
    • 使用 Iterator.remove()
    • 使用并发集合。

Q3: IteratorListIterator 的区别?

  • Iterator 适用于所有集合,支持单向遍历。
  • ListIterator 专用于 List,支持双向遍历和插入操作。

9. 总结

Iterator 是 Java 集合框架中最常用的遍历工具,适用于所有集合类型。它提供了简单、安全的遍历方式,同时支持动态删除操作。在现代开发中,for-eachStream 逐渐成为主流,但 Iterator 仍然是不可或缺的基础工具。

到此这篇关于Java iterator常见用法的文章就介绍到这了,更多相关Java iterator内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java线程优先级变量及功能

    Java线程优先级变量及功能

    这篇文章主要介绍了Java线程优先级变量及功能,关于优先级的问可能有两个或更多线程被分配了相同的优先级,那么它们的执行取决于操作系统,更多相关介绍,需要的小伙伴可以参考一下
    2022-06-06
  • 谈谈Java中自定义注解及使用场景

    谈谈Java中自定义注解及使用场景

    这篇文章主要介绍了谈谈Java中自定义注解及使用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • maven快速生成SpringBoot打包文件的方法步骤

    maven快速生成SpringBoot打包文件的方法步骤

    本文主要介绍了使用Maven快速生成SpringBoot项目打包文件的方法,包括如何生成可执行的JAR文件,如何将配置文件、运行脚本、调试脚本、证书文件等拷贝到指定目录,及如何编译出部署包,这种方法能大大方便微服务的部署,提高部署效率
    2024-10-10
  • MyBatis-Plus使用sl4j日志打印SQL的代码详解

    MyBatis-Plus使用sl4j日志打印SQL的代码详解

    以下是关于使用 Spring Boot 起始器替换 slf4j-api 和 logback 依赖的详细步骤和注意事项,包括 MyBatis-Plus 的默认日志级别信息,需要的朋友可以参考下
    2024-10-10
  • JDK 1.8 安装配置教程(win7 64bit )

    JDK 1.8 安装配置教程(win7 64bit )

    这篇文章主要为大家详细介绍了win7 64bit下JDK 1.8 安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • mybatis中association标签的使用解读

    mybatis中association标签的使用解读

    这篇文章主要介绍了mybatis中association标签的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java使用正则表达式实现找出数字功能示例

    Java使用正则表达式实现找出数字功能示例

    这篇文章主要介绍了Java使用正则表达式实现找出数字功能,结合实例形式分析了Java针对数字的匹配查找及非数字替换操作相关实现技巧,需要的朋友可以参考下
    2017-03-03
  • 浅析java中next与nextLine用法对比

    浅析java中next与nextLine用法对比

    这篇文章主要介绍了java中next与nextLine用法区别以及实例分析了他们的区别,需要的朋友可以参考下
    2017-04-04
  • java中 String和StringBuffer的区别实例详解

    java中 String和StringBuffer的区别实例详解

    这篇文章主要介绍了java中 String和StringBuffer的区别实例详解的相关资料,一个小的例子,来测试String和StringBuffer在时间和空间使用上的差别,需要的朋友可以参考下
    2017-04-04
  • json如何解析混合数组对象到实体类的list集合里去

    json如何解析混合数组对象到实体类的list集合里去

    这篇文章主要介绍了json解析混合数组对象到实体类的list集合里去的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论