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删除文件、目录及目录下所有文件的方法,文中给出了详细的示例代码与注解,有需要的朋友可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • 详解Springboot 优雅停止服务的几种方法

    详解Springboot 优雅停止服务的几种方法

    这篇文章主要介绍了详解Springboot 优雅停止服务的几种方法 ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Java模拟实现HashMap算法流程详解

    Java模拟实现HashMap算法流程详解

    在java开发中,HashMap是最常用、最常见的集合容器类之一,文中通过示例代码介绍HashMap为啥要二次Hash,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • Spring Boot 整合单机websocket的步骤 附github源码

    Spring Boot 整合单机websocket的步骤 附github源码

    websocket 是一个通信协议,通过单个 TCP 连接提供全双工通信,这篇文章主要介绍了Spring Boot 整合单机websocket的步骤(附github源码),需要的朋友可以参考下
    2021-10-10
  • 一篇文章带你详解Spring的概述

    一篇文章带你详解Spring的概述

    这篇文章主要为大家介绍了Spring的概述,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 优化常见的java排序算法

    优化常见的java排序算法

    这篇文章主要介绍了Java编程中快速排序算法的实现及相关算法优化,快速排序算法的最差时间复杂度为(n^2),最优时间复杂度为(n\log n),存在优化的空间,需要的朋友可以参考下
    2021-07-07
  • Maven版本冲突的三种解决方法

    Maven版本冲突的三种解决方法

    在Maven项目中,依赖传递可能导致Jar包版本冲突,常见的解决策略包括依赖排除、版本锁定和使用maven-shade-plugin插件,本文就来介绍一下这三种解决方法,感兴趣的可以了解一下
    2024-10-10
  • Spring Boot 整合 Fisco Bcos的案例分析(区块链)

    Spring Boot 整合 Fisco Bcos的案例分析(区块链)

    本篇文章介绍的 Spring Boot 整合 Fisco Bcos的案例,是在阿里云服务器上部署验证的。大家可根据自己的电脑环境,对比该案例进行开发即可,具体案例代码跟随小编一起看看吧
    2022-01-01
  • 浅谈常用字符串与集合类转换的工具类

    浅谈常用字符串与集合类转换的工具类

    下面小编就为大家带来一篇浅谈常用字符串与集合类转换的工具类。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • SpringBoot @Value与@ConfigurationProperties二者有哪些区别

    SpringBoot @Value与@ConfigurationProperties二者有哪些区别

    这篇文章主要介绍了SpringBoot @Value与@ConfigurationProperties二者的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10

最新评论