for-each循环遍历arraylist最简洁,底层调用iterator,安全且可读性强,但不能修改集合或获取索引;需索引时应使用传统for循环。

用for-each循环遍历ArrayList最简洁
绝大多数场景下,直接用 for (Type item : list) 就够了。它底层调用 Iterator,安全、可读性强,且编译后和手动写迭代器性能几乎一致。
- 不能在遍历时修改集合(如
list.remove(item)),否则抛ConcurrentModificationException - 不适用于需要索引的操作(比如要同时访问
list.get(i)和list.get(i+1)) - 泛型擦除不影响使用,
ArrayList<string></string>和ArrayList<integer></integer>写法完全一样
需要索引时用传统for循环
当逻辑依赖下标(比如跳过首项、两两配对、反向遍历),必须用 for (int i = 0; i 。
-
list.size()是 O(1),不用担心性能问题 - 避免写成
i ,容易因空集合导致 <code>-1下标越界 - 如果循环中会删元素,记得调整索引(如
i--),否则会漏掉下一个元素
要边遍历边删除必须用Iterator.remove()
想过滤掉某些元素,不能用 for-each 或传统 for 直接调 list.remove(),必须用迭代器的 remove() 方法。
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if (s.startsWith("tmp")) {
it.remove(); // 安全删除
}
}-
it.remove()是唯一允许在遍历时安全删元素的方式 -
list.remove()或list.remove(index)都会触发快速失败机制 - Java 8 的
removeIf(Predicate)本质也是封装了这个逻辑,更简洁
Stream遍历适合函数式处理但有额外开销
如果要做映射、过滤、聚合等操作,list.stream().filter(...).map(...).collect(...) 更自然;但纯遍历打印或简单判断,没必要上 Stream。
立即学习“Java免费学习笔记(深入)”;
- 每次调用
stream()都创建新对象,小数据量不明显,高频调用要注意 - 并行流(
parallelStream())只在计算密集且数据量大时才有收益,集合遍历本身不是瓶颈 - 调试时 Stream 调用栈更深,出错时堆栈信息不如传统循环直观
实际项目里,90% 的遍历用 for-each;需要下标就切传统 for;真要删元素就上 Iterator 或 removeIf。Stream 别为了“看起来高级”而滥用——尤其是你还在 debug 空指针的时候。










