Java 每日一题: for 与 foreach 的区别 ?

for 循环:是最基本的循环结构,可以通过初始化语句、循环条件和迭代语句来控制循环的执行。

foreach 循环(也称为增强型 for 循环):用于遍历集合或数组中的元素,简化了遍历过程,没有显式地控制索引,而是直接访问每一个元素。

1)for、foreach 都能遍历集合或者数组,在面对复杂逻辑的情况下,for 的效率更高。

2)for 可以删除元素;foreach 不能,只能通过迭代器的 remove去删除。

3)for 可以修改集合里面的元素/属性;foreach 不能修改元素,只能修改元素里面的属性。

4)for 适用于自定义步长、需要获取索引的场景; 适用于需要访问每个元素而不关心元素索引的场景。

foreach 不能删除元素的原因如下:

foreach 内部使用迭代器,它会在每次遍历会记录 List 集合内部的 modcount 作为预期值,即迭代器自己的 expectedModCount,如果直接使用 list.remove 则是 List 集合内部的 modcount 会自增,而期望值没变,则会抛出异常 ConcurrentModificationException。

示例代码(错误的方式):

java 复制代码
List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
for (String item : list) {
    if ("two".equals(item)) {
        list.remove(item); // 这将抛出 ConcurrentModificationException
    }
}

示例代码(正确的方式):

java 复制代码
List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String item = it.next();
    if ("two".equals(item)) {
        it.remove(); // 安全删除
    }
}

foreach 不能修改元素的原因也是如此。

相关推荐
highreport几秒前
net报表工具对比:HighReport 与 FastReport
java·c#
奈斯先生Vector1 分钟前
AIGC 视频生成实战:用 Kling Video 拆解文生视频、图生视频与完整工作流
开发语言·人工智能·windows·python·aigc·音视频
吃饱了得干活4 分钟前
Redis 不是死脑筋,它是一套“会进化”的存储系统
redis·后端
伩仁4 分钟前
别再 HTTP 200 一把梭了:用 RFC 9457 Problem Details 给 FastAPI 错误响应"立规矩"
后端
小玮看世界6 分钟前
[Python]螺旋遍历 vs 最短路径:方向控制类算法的“同源异流”
开发语言·python·算法
MeetTanG7 分钟前
Go 实战锦囊|errgroup:优雅地管理并发任务组
后端·go
xiaoqiMikko13 分钟前
七条 advisory 各给了一个修复版,而一次修完的那个数字一条都没写
java·spring boot
vHelios13 分钟前
【电商项目】短信测试遇到的问题与解决方案:InaccessibleObjectException报错、单元测试通过但未接收到验证码
java·微服务
PragmaticWorks16 分钟前
DDD 学了很多却用不上?因为你把“责任”和“时机”揉在了一起
后端·领域驱动设计
OPEN-F16 分钟前
ROS2系列教程:tf2坐标变换详解(C++/Python)
开发语言·c++·python