List集合有哪些常见的遍历方式?
参考回答
List
集合是 Java 中常用的集合类型,支持多种遍历方式。以下是常见的 List
遍历方法:
- 增强型
for
循环(for-each) - 普通
for
循环 Iterator
遍历ListIterator
遍历Stream
API(Java 8+)forEach
方法(Java 8+)
详细讲解与示例
1. 增强型 for
循环
- 特点:
- 简洁易用。
- 遍历过程中不需要显式管理索引。
- 适用于读取元素(不可修改集合结构)。
- 示例:
import java.util.ArrayList; import java.util.List; public class ForEachLoop { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); for (String item : list) { System.out.println(item); } } }
- 注意事项:
- 不可直接在循环中调用
list.remove()
或list.add()
,否则会抛出ConcurrentModificationException
。
- 不可直接在循环中调用
2. 普通 for
循环
- 特点:
- 可以通过索引访问元素。
- 适合需要索引操作的场景,例如根据索引删除或替换元素。
- 示例:
import java.util.ArrayList; import java.util.List; public class ForLoop { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); for (int i = 0; i < list.size(); i++) { System.out.println("Index " + i + ": " + list.get(i)); } } }
- 注意事项:
- 删除或添加元素时需要调整索引或使用反向遍历,避免跳过元素或引发异常。
3. Iterator
遍历
- 特点:
- 提供
hasNext()
和next()
方法遍历集合。 - 可通过
Iterator
的remove()
方法安全地删除元素。
- 提供
- 示例:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorTraversal { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); System.out.println(item); } } }
- 安全删除示例:
Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); if ("B".equals(item)) { iterator.remove(); // 正确删除,不会抛出异常 } }
- 注意事项:
- 不要在迭代过程中直接使用
list.remove()
,否则会抛出ConcurrentModificationException
。
- 不要在迭代过程中直接使用
4. ListIterator
遍历
- 特点:
- 是
Iterator
的扩展,用于双向遍历List
。 - 提供方法:
hasPrevious()
和previous()
:支持反向遍历。add(E e)
和set(E e)
:支持插入和替换元素。
- 是
- 示例:
import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ListIteratorTraversal { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); ListIterator<String> listIterator = list.listIterator(); // 正向遍历 while (listIterator.hasNext()) { System.out.println("Next: " + listIterator.next()); } // 反向遍历 while (listIterator.hasPrevious()) { System.out.println("Previous: " + listIterator.previous()); } } }
5. 使用 Stream
API(Java 8+)
- 特点:
- 支持声明式编程,代码简洁。
- 可以结合
filter()
、map()
、forEach()
等方法实现复杂操作。 - 适合需要对集合进行流式处理的场景。
- 示例:
import java.util.ArrayList; import java.util.List; public class StreamAPITraversal { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); list.stream().forEach(System.out::println); } }
- 带条件的遍历:
list.stream() .filter(item -> !"B".equals(item)) // 过滤掉 "B" .forEach(System.out::println);
6. 使用 forEach
方法(Java 8+)
- 特点:
List
集合继承了Iterable
接口,因此支持forEach
方法。- 与
Stream
类似,但语法更简单,直接遍历每个元素。
- 示例:
import java.util.ArrayList; import java.util.List; public class ForEachMethodTraversal { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); list.forEach(item -> System.out.println(item)); } }
- 结合方法引用:
list.forEach(System.out::println);
各遍历方式的对比
方式 | 特点 | 适用场景 |
---|---|---|
增强型 for 循环 |
简洁易用,不需要手动管理索引。 | 仅需要读取元素时使用。 |
普通 for 循环 |
支持按索引访问,可以灵活操作索引。 | 需要索引操作,或可能删除/替换元素。 |
Iterator 遍历 |
支持安全删除元素,避免并发修改异常。 | 需要删除元素时,推荐使用。 |
ListIterator 遍历 |
支持双向遍历,同时支持添加或修改元素。 | 需要双向遍历或插入/替换元素时使用。 |
Stream API |
声明式编程,支持复杂的流式操作,如过滤、映射、排序等。 | 需要流式处理集合时使用。 |
forEach 方法 |
简洁的遍历方式,适合直接操作每个元素。 | 简单的逐一操作或结合方法引用时使用。 |
总结
List
集合的常见遍历方式有多种,选择合适的方式取决于具体需求:
- 仅遍历:增强型
for
循环或forEach
方法更简单。 - 需要索引:使用普通
for
循环。 - 安全删除:优先使用
Iterator
的remove()
。 - 双向遍历:使用
ListIterator
。 - 复杂操作:推荐使用
Stream
API。