在Java集合体系中,遍历是最常用的操作之一。针对单列集合,Java 提供了迭代器作为通用的遍历标准,同时衍生出增强 for 循环forEach 方法等多种便捷写法。本文将从基础使用、底层源码、遍历方式对比、常见坑点四个维度,系统梳理迭代器相关全部知识点。

Collection 接口基础铺垫

在讲解迭代器之前,先明确两个核心前提:

  1. Collection 是所有单列集合的父接口,它定义的通用方法,所有单列集合(ArrayList、LinkedList、HashSet 等)都可以直接使用。​
  2. remove() 、 contains() 方法底层依赖对象的 equals 方法。
  3. 自定义对象存集合,必须重写equals()和toString(),否则默认比较内存地址,导致删不掉、查不到元素。

迭代器核心使用

1、核心两个方法

  • hasNext() :判断是否还有下一个元素
  • next() :获取元素,指针后移

2、使用流程

  1. 集合获取迭代器
  2. while循环判断hasNext()
  3. next()取出元素
  4. 指针原理:迭代器初始指针在第一个元素之前执行逻辑:先取值,再指针后移

ArrayList迭代器源码核心

迭代器由内部类 Itr 实现,三个核心变量:

  • cursor :下一个元素索引(遍历指针)
  • ​ lastRet :上一次遍历元素索引
  • expectedModCount :记录集合修改次数,防止并发修改异常
    核心源码逻辑:
  1. hasNext() :判断 cursor != size
  2. next() :校验并发修改 → 取值 → 指针+1

单列集合三种遍历方式

1、Iterator迭代器遍历

  • 优点:遍历中可以安全删除元素
  • 缺点:代码稍长
  • 适用:需要遍历删除元素的场景

2、增强for循环(foreach)
语法糖,编译后本质就是迭代器

  • 优点:代码简洁
  • 缺点:遍历中不能增删集合元素

3、JDK8 forEach遍历
Lambda极简遍历

  • 优点:代码最简洁
  • 缺点:无法操作索引、不能增删元素

三种遍历对比总结

  1. 需要删元素 → 原生迭代器
  2. 普通遍历、追求简洁 → 增强for
  3. 简单打印、流式处理 → forEach + Lambda

高频踩坑总结(必记)

  1. 一次循环只能调用一次next()多次调用会跳过元素,直接报错。
  2. 迭代遍历中禁止使用集合add/remove
    会抛出 ConcurrentModificationException 并发修改异常✅ 删元素必须使用:迭代器自带 remove() ​
  3. 自定义对象必须重写equals否则集合删除、判断包含全部失效。

最终总结

  1. Iterator是Java单列集合统一遍历规范。​
  2. 增强for是迭代器的语法糖,底层完全一致。​
  3. 迭代器依靠指针遍历,支持安全删除元素。​
  4. 遍历过程禁止集合结构性修改,防止并发修改异常。​
  5. 自定义实体类存集合,必须重写equals、toString。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐