233. Java 集合 - 遍历 Collection 中的元素

233. Java 集合 - 遍历 Collection 中的元素

在 Java 中,遍历集合(Collection)的方法有几种。不同方式适用于不同场景,比如只读遍历带元素删除的遍历等。


🚶 使用 for-each 遍历集合(最简单)

如果你只需要读取元素 ,使用for-each语法是最简单、最推荐的:

java 复制代码
Collection<String> strings = List.of("one", "two", "three");

for (String element : strings) {
    System.out.println(element);
}

🖨️ 输出

java 复制代码
one
two
three

优点

  • 简洁清晰
  • 没有索引管理的麻烦
  • 不容易出错

⚠️ 注意for-each 只适合读取元素 ,不能在遍历过程中修改集合(比如删除元素)。


🧹 使用 Iterator 遍历集合(可修改元素)

如果你需要在遍历时安全地删除元素 ,那么需要使用 Iterator

Iterator 遍历模式

java 复制代码
Collection<String> strings = List.of("one", "two", "three", "four");

for (Iterator<String> iterator = strings.iterator(); iterator.hasNext(); ) {
    String element = iterator.next();
    if (element.length() == 3) {
        System.out.println(element);
    }
}

🖨️ 输出

java 复制代码
one
two

🛠️ Iterator 的三个重要方法

方法 作用
hasNext() 判断是否还有下一个元素
next() 取出下一个元素(并移动光标)
remove() 删除当前元素(可选操作,并非所有集合都支持)

⚡ remove() 方法的使用

可变集合 (如 ArrayListLinkedListHashSet)中,可以通过 iterator.remove() 删除当前元素。

正确示例

java 复制代码
Collection<String> strings = new ArrayList<>(List.of("one", "two", "three", "four"));

Iterator<String> iterator = strings.iterator();
while (iterator.hasNext()) {
    String element = iterator.next();
    if (element.length() == 3) {
        iterator.remove(); // 删除长度为3的元素
    }
}

System.out.println(strings);

🖨️ 输出

java 复制代码
[three, four]

🚨 注意事项

  • 必须先调用 next() 再调用 remove()
  • 直接在集合上调用 remove()(而不是通过 iterator)将引发问题。

❗ 集合修改异常:ConcurrentModificationException

如果你在遍历过程中直接修改集合内容 (比如用 collection.remove() 而不是 iterator.remove()),就可能抛出 ConcurrentModificationException

来看一个错误示例:

java 复制代码
Collection<String> strings = new ArrayList<>();
strings.add("one");
strings.add("two");
strings.add("three");

Iterator<String> iterator = strings.iterator();
while (iterator.hasNext()) {
    String element = iterator.next();
    strings.remove(element); // ❌ 错误:直接修改集合
}

运行时抛出异常:

java 复制代码
Exception in thread "main" java.util.ConcurrentModificationException

🎯 正确的删除姿势

如果需要根据某个条件批量删除元素,推荐使用 removeIf() 方法(从 Java 8 开始提供):

java 复制代码
Collection<String> strings = new ArrayList<>(List.of("one", "two", "three", "four"));

strings.removeIf(s -> s.length() == 3);

System.out.println(strings);

🖨️ 输出

java 复制代码
[three, four]

这种写法更加现代、简洁、避免了繁琐的迭代器操作!


📌 小结

技术 适用场景 特点
for-each 循环 只读取元素 简洁高效,不能修改集合
Iterator 迭代器 需要在遍历时删除元素 支持安全删除,需注意正确调用顺序
removeIf(Predicate) 批量删除符合条件的元素 简洁优雅,推荐使用(Java 8及以上)
相关推荐
爱敲代码的小杨.3 分钟前
【Spring】Spring Web MVC
前端·spring·mvc
杨运交18 分钟前
[069][公共模块]Spring Boot 全局异常处理与参数校验实战(下):校验异常精细化处理与 WebFlux 适配
java·spring boot·后端
是立不是利23 分钟前
深入理解JavaScript事件委托
开发语言·前端·javascript
晴天1632 分钟前
React 版本迭代解析:从15到19 核心差异-Day40
前端·react.js·前端框架
Andya_net44 分钟前
Spring Boot | 条件注解完全指南:从 @Conditional 到 @ConditionalOnExpression 的原理、实践与避坑
spring boot·后端·python
APItesterCris1 小时前
告别人工盯品!借助 Open‑Claw 快速搭建电商商品全自动监控与数据分析系统(完整实操代码)
java·大数据·前端·数据库
ly76891 小时前
Spring 中的 @Configuration 与 @Component 差异:为何代理时机决定 Bean 生命周期行为
java·后端·spring·注解·代理·bean生命周期
明月_清风1 小时前
字符串匹配四大经典算法:BF、RK、BM、KMP 到底有什么区别?
后端·算法
卷无止境1 小时前
测试全绿,功能能跑,代码却烂到没法上线:AI编程助手留下的十个坑
后端·python
啊阿狸不会拉杆1 小时前
《计算机网络-自顶向下方法》6.7 回顾:Web页面请求的历程 读书笔记
前端·计算机网络