当前位置: 首页 > news >正文

Java集合——14.使用Iterator

目录
  • Java的迭代器Iterator
    • 迭代器的作用
    • Iterator的核心方法和标准流程
    • 迭代器的优势
    • 自定义迭代器
    • 注意事项
    • 总结


Java的迭代器Iterator

在Java集合框架中,Iterator(迭代器)是一种用于遍历集合元素的抽象接口,为各种不同的集合提供了统一的遍历方式。

迭代器的作用

for each循环是Java中遍历集合的常用方式,例如:

List<String> fruits = List.of("Apple", "Orange", "Pear");
for (String fruit : fruits) {System.out.println(fruit);
}

实际上,编译器会将上述for each循环自动转换为基于Iterator的遍历代码:

for (Iterator<String> it = fruits.iterator(); it.hasNext(); ) {String fruit = it.next();System.out.println(fruit);
}

这种转换揭示了迭代器的作用:为所有集合提供统一的访问接口,而无需暴露集合的内部存储结构。

Iterator的核心方法和标准流程

Iterator接口定义了三个核心方法:

  • boolean hasNext():判断是否还有下一个元素
  • E next():返回下一个元素并移动指针
  • void remove():删除当前元素(可选操作)

使用迭代器遍历集合的标准流程:

  1. 通过hasNext()判断是否有未遍历的元素
  2. 通过next()获取元素并移动指针
  3. 重复上述步骤直到遍历完成

迭代器的优势

与直接使用集合的特定方法(如get(int))遍历相比,迭代器的好处在于统一和高效:

  1. 统一性:无需集合的内部存储结构,无论集合类型是ArrayListLinkedList还是HashSet,都可以用相同的迭代器代码遍历

  2. 高效性:迭代器由集合对象内部创建,集合可以根据自身特点实现最高效的遍历算法。例如:

    • ArrayList的迭代器可直接通过索引访问元素
    • LinkedList的迭代器则通过节点指针移动,避免了get(int)的低效访问

自定义迭代器

如果我们需要创建自定义集合类并支持for each循环,只需完成两个步骤:

  1. 让集合类实现Iterable接口,重写iterator()方法返回一个Iterator实例
  2. 实现Iterator接口,定义具体的遍历逻辑

下面是一个倒序遍历集合的自定义迭代器示例:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;// 自定义可迭代集合
class ReverseList<T> implements Iterable<T> {private List<T> innerList = new ArrayList<>();public void add(T element) {innerList.add(element);}@Overridepublic Iterator<T> iterator() {// 返回自定义迭代器return new ReverseIterator();}// 内部类实现迭代器private class ReverseIterator implements Iterator<T> {private int currentIndex;public ReverseIterator() {// 从最后一个元素开始currentIndex = innerList.size() - 1;}@Overridepublic boolean hasNext() {return currentIndex >= 0;}@Overridepublic T next() {T element = innerList.get(currentIndex);currentIndex--; // 向前移动指针return element;}}
}// 使用示例
public class Main {public static void main(String[] args) {ReverseList<String> list = new ReverseList<>();list.add("First");list.add("Second");list.add("Third");// 支持for each循环for (String s : list) {System.out.println(s); // 输出Third、Second、First}}
}

在这个例子中:

  • ReverseList实现了Iterable接口,提供了iterator()方法
  • 内部类ReverseIterator实现了具体的倒序遍历逻辑
  • 调用者可以像使用普通集合一样通过for each循环遍历

注意事项

  1. 并发修改问题:在迭代过程中如果直接修改集合(如调用add()remove()),会导致ConcurrentModificationException。如需修改,应使用迭代器自身的remove()方法

  2. 空元素处理:迭代器可以处理null元素,但需注意next()返回null时可能是正常元素,需结合hasNext()判断

总结

Iterator是一种抽象的数据访问模型,它的价值在于:

  • 为各种集合提供了统一的访问方式
  • 使调用者对集合内部结构一无所知
  • 允许集合类根据自身特点实现最优遍历算法
    Java提供了标准的迭代器模型,即集合类实现java.util.Iterable接口,返回java.util.Iterator实例。
http://www.sczhlp.com/news/11556/

相关文章:

  • 给定一个测试需求如何提取测试点设计测试用例? 附带,测试用例设计案例。 - 张
  • 【WT588F】网页上位机操作演示
  • 附部署代码|云数据库RDS 全托管 Supabase服务:小白轻松搞定开发AI应用!
  • Swoole 协程调度核心架构及工作流
  • 彩笔运维勇闯机器学习--cpu与qps的线性关系
  • AXUI 发布万能网页模版,包含 100+ 设计精美的模块,复制可用,适合展示型网站
  • 会话复用 tmux -- SSH 断开,进程还可以跑的方法
  • 666分
  • NioEventLoopGroup 完全指南
  • centos 7 升级glibc2.17-2.18库(更新动态连接库)
  • 告别手动更新!WinForm 应用轻松集成自动升级功能 (HHUpdateApp)
  • 高二暑假会议记录
  • 2023年下半年中级信息安全工程师上午真题及答案解析
  • Dell OpenManage Enterprise 4.5 - Dell 服务器、存储和网络设备集中管理软件
  • 高三寒假会议记录
  • 软考中级信息安全工程师近10年历史真题
  • 2025年激光、光学技术与应用国际学术会议(LOTA 2025)
  • CDQ、整体二分、树套树
  • 医院必备:Ferry内外网文件传输工具,筑牢数据安全防线!
  • van-checkbox 倒角
  • 医疗行业跨网文件传输难题?Ftrans内外网摆渡系统3步破局
  • 决策树
  • 【刷题笔记】日照集训 Day4
  • 三分钟答辩稿、高频答辩问答【附论文答辩PPT模板】
  • activiti工作流发起时出现事务冲突的解决方案
  • Java集合——13.使用Stack
  • P1004 [NOIP 2000 提高组] 方格取数题解
  • 蓝牙耳机连接电脑解决方法
  • 组合计数学习笔记
  • 开源中国:以本土化创新驱动中国企业数字化转型新范式