Java 中数组和集合的遍历方式
Java 中数组和集合的遍历方式,特别是 list.iterator(),并对比其他常用方法。
🧩 一、先澄清概念:数组 vs List
类型 示例 说明
数组(Array) String[] arr = new String[3]; 固定长度,底层数据结构
List(集合) List list = new ArrayList<>(); 可变长度,接口,常用 ArrayList、LinkedList
✅ 您说的 list.iterator() 是针对 List 集合 的遍历方式。
🔁 二、List 的 5 种遍历方式
我们以一个 List 为例:
java
List list = Arrays.asList(“apple”, “banana”, “orange”);
✅ 方式 1:使用 Iterator(您问的)
java
Iterator it = list.iterator();
while (it.hasNext()) {
String item = it.next();
System.out.println(item);
}
🔍 特点:
最基础的遍历方式
可以在遍历时安全地 删除元素(用 it.remove())
适用于所有 Collection 类型
❗ 注意:
java
System.out.println(list.iterator().next());
// 这只会打印第一个元素,不是完整遍历!
✅ 方式 2:增强 for 循环(for-each)
java
for (String item : list) {
System.out.println(item);
}
🔍 特点:
简洁、易读
内部其实也是用 Iterator
不能在遍历时删除元素(会抛 ConcurrentModificationException)
✅ 推荐日常使用
✅ 方式 3:普通 for 循环(通过索引)
java
for (int i = 0; i < list.size(); i++) {
String item = list.get(i);
System.out.println(item);
}
🔍 特点:
可以获取索引 i
适合需要知道位置的场景
对 ArrayList 快(随机访问),对 LinkedList 慢(逐个查找)
✅ 方式 4:Lambda 表达式(forEach)
java
list.forEach(item -> System.out.println(item));
或更简洁:
java
list.forEach(System.out::println);
🔍 特点:
Java 8+ 支持
函数式编程风格
代码最简洁
✅ 方式 5:Stream 流式处理
java
list.stream()
.forEach(System.out::println);
🔍 特点:
支持过滤、映射等复杂操作
适合大数据处理
可并行执行(parallelStream())
🔁 三、数组的遍历方式
java
String[] arr = {“apple”, “banana”, “orange”};
✅ 方式 1:普通 for 循环
java
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
✅ 方式 2:增强 for 循环
java
for (String item : arr) {
System.out.println(item);
}
✅ 方式 3:转为 Stream
java
Arrays.stream(arr).forEach(System.out::println);
⚠️ 数组没有 iterator() 方法,但可以通过 Arrays.stream(arr).iterator() 获取。
🆚 四、对比总结
遍历方式 是否可删除 是否有索引 适用类型 推荐度
Iterator ✅ it.remove() ❌ Collection ⭐⭐⭐⭐
增强 for ❌ ❌ Array, Iterable ⭐⭐⭐⭐⭐
普通 for ❌ ✅ Array, List ⭐⭐⭐⭐
forEach() ❌ ❌ Iterable ⭐⭐⭐⭐⭐
Stream ❌ ❌ Collection, Array ⭐⭐⭐⭐⭐
💡 五、Iterator 的核心方法
java
Iterator it = list.iterator();
it.hasNext(); // → true/false,是否还有下一个元素
it.next(); // → 返回下一个元素,并移动指针
it.remove(); // → 删除上一次 next() 返回的元素(可选操作)
📌 经典错误:
java
it.remove(); // ❌ 抛 IllegalStateException
// 必须先 next() 才能 remove
📌 安全删除示例:
java
Iterator it = list.iterator();
while (it.hasNext()) {
String item = it.next();
if (“banana”.equals(item)) {
it.remove(); // ✅ 安全删除
}
}
✅ 六、最佳实践建议
场景 推荐方式
日常遍历打印 for (item : list) 或 list.forEach(System.out::println)
需要索引 普通 for 循环
遍历中删除 Iterator
复杂数据处理 Stream
性能敏感(大量数据) 普通 for(ArrayList)或 Iterator
✅ 七、关于 list.iterator().next()
您之前代码中:
java
System.out.println(list.iterator().next());
这相当于:
java
Iterator it = list.iterator(); // 创建一个新迭代器
it.next(); // 取第一个元素
⚠️ 它只取第一个元素,不是遍历!
如果想遍历,必须用 while (it.hasNext()) 循环。
✅ 总结
list.iterator() 是遍历 List 的一种底层方式,适合需要 安全删除 的场景。
日常开发推荐使用 增强 for 循环 或 forEach。
数组和 List 的遍历方式略有不同,注意区分。
iterator().next() 只取一个元素,不是遍历。
