在Java集合框架中,遍历集合元素是我们日常开发中最常用的操作之一。今天我们来总结一下两种核心的遍历方式:迭代器(Iterator) 和 增强for循环,并重点剖析一下迭代器的底层逻辑。
一、 迭代器 (Iterator) 概述
1. 什么是迭代器?
迭代器是用来遍历集合的专用方式。
- 注意:数组是没有迭代器的,迭代器是专门为集合(Collection)设计的。但是数组也可以使用增强for循环,只是增强for循环的底层不一样。
- 在Java中,迭代器的代表接口是
Iterator。
2. 如何获取迭代器?
所有的 Collection 集合都提供了一个方法来获取迭代器对象:
| 方法名称 | 说明 |
|---|---|
Iterator<E> iterator() | 返回集合中的迭代器对象,该迭代器对象默认指向当前集合的第一个元素之前的位置。 |
3. Iterator 常用方法
| 方法名称 | 说明 |
|---|---|
boolean hasNext() | 询问当前位置是否有元素存在。存在返回 true,不存在返回 false。 |
E next() | 获取当前位置的元素,并同时将迭代器对象指向下一个元素处。 |
重点理解:迭代器类似“指针”
很多初学者觉得迭代器很抽象,其实我们可以把它想象成 C/C++ 中的指针或者一个游标。
- 初始状态:当你调用
iterator()时,这个“指针”并没有指向第一个元素,而是指向第一个元素的前面(索引 -1 的位置)。 - hasNext():相当于问指针:“你后面还有东西吗?”
- next():这个动作包含两步操作:
- 第一步:指针向后移动一位(指向下一个元素)。
- 第二步:把指针当前指向的这个元素拿出来给你。
代码演示:
Collection<String> c = new ArrayList<>();
c.add("Hello");
c.add("World");
// 1. 获取迭代器(指针初始化,指向 "Hello" 之前)
Iterator<String> it = c.iterator();
// 2. 判断是否有下一个元素
if (it.hasNext()) {
// 3. 指针后移,取出 "Hello"
String s = it.next();
System.out.println(s);
}
if (it.hasNext()) {
// 指针继续后移,取出 "World"
String s = it.next();
System.out.println(s);
}
二、 增强 for 循环 (Enhanced for-loop)
虽然迭代器功能强大,但写起来代码略显繁琐(需要定义变量、判断、取值)。Java 5 引入了增强 for 循环来简化这一过程。
1. 格式
for (元素的数据类型 变量名 : 数组或者集合) {
// 循环体
}
2. 代码示例
Collection<String> c = new ArrayList<>();
c.add("Java");
c.add("Python");
// 增强for遍历
for (String s : c) {
System.out.println(s);
}
3. 核心本质(面试考点)
- 适用范围:增强 for 可以用来遍历集合或者数组。
- 底层原理:增强 for 遍历集合,本质就是迭代器遍历集合的简化写法。
- 当你写
for(String s : c)时,编译器在底层会自动帮你生成类似Iterator的代码。 - 这也解释了为什么在增强 for 循环中不能直接删除集合元素(会抛出
ConcurrentModificationException),因为底层迭代器检测到了集合结构被修改。
- 当你写
4.写增强for语句的快捷键
集合对象名.for+按Tab健
三、 总结
- 迭代器是遍历集合的标准方式,理解它就像一个移动的指针,
next()方法既是“移动”也是“取值”。 - 增强 for 是迭代器的语法糖,写起来更简洁,适合单纯的遍历读取。
- 如果需要在遍历过程中删除元素,必须使用迭代器的
remove()方法,而不能使用集合本身的remove()或增强 for。
与增强for循环&spm=1001.2101.3001.5002&articleId=163927786&d=1&t=3&u=e49205bd86864b5987048c0578e983e4)
5032

被折叠的 条评论
为什么被折叠?



