Java增强for循环(小白友好版)

前言:为什么需要增强for循环?

作为Java初学者,你或许已经学会使用传统for循环来遍历数组或集合:

for (int i = 0; i < array.length; i++) {System.out.println(array[i]);
}

这种写法需要手动维护索引变量i,对于集合还需要使用迭代器,代码略显繁琐。Java 5引入了增强for循环​(enhanced for loop),也称为for-each循环,专门解决遍历数据结构时的痛点。它让你的代码更简洁、更安全、更易读。

什么是增强for循环?

增强for循环是一种简化的循环结构,用于遍历数组或集合中的每个元素,无需关心索引位置或迭代器操作。其核心思想是:"对集合中的每个元素执行以下操作"。

🔍 基础语法解析

for (元素类型 变量名 : 集合或数组) {// 使用变量名操作当前元素
}
  • 元素类型​:集合/数组中元素的数据类型
  • 变量名​:表示当前遍历元素的临时变量
  • 集合或数组​:要遍历的数据结构

🌟 与普通for循环的关键区别

比较项普通for循环增强for循环
代码复杂度需手动维护索引/迭代器自动处理遍历细节
可读性需要理解索引逻辑直观表达"每个元素"
安全性可能数组越界自动边界检查
适用数据结构数组、基于索引的集合数组和所有可迭代对象

🚀 实战演练:不同场景下的增强for循环

案例1:遍历数组

String[] fruits = {"苹果", "香蕉", "橙子"};// 使用增强for循环遍历
for (String fruit : fruits) {System.out.println("我喜欢吃" + fruit);
}// 等效的普通for循环
for (int i = 0; i < fruits.length; i++) {System.out.println("我喜欢吃" + fruits[i]);
}

案例2:遍历List集合

List<String> cities = List.of("北京", "上海", "广州", "深圳");// 增强for循环更简洁
for (String city : cities) {System.out.println("中国城市: " + city);
}

案例3:遍历Set集合

Set<Integer> numbers = Set.of(1, 3, 5, 7, 9);for (int num : numbers) {System.out.println("奇数: " + num);
}

案例4:遍历Map集合

Map<String, Integer> studentScores = Map.of("小明", 92,"小红", 88,"小刚", 95
);// 遍历键值对
for (Map.Entry<String, Integer> entry : studentScores.entrySet()) {System.out.println(entry.getKey() + "的分数: " + entry.getValue());
}// 仅遍历键
for (String name : studentScores.keySet()) {System.out.println("学生姓名: " + name);
}// 仅遍历值
for (int score : studentScores.values()) {System.out.println("考试成绩: " + score);
}

⚠ 注意事项:避免常见的坑

1. ​禁止在遍历中修改集合结构

List<String> list = new ArrayList<>(List.of("A", "B", "C"));// 错误做法:直接删除元素
for (String item : list) {if (item.equals("B")) {list.remove(item); // 抛出ConcurrentModificationException异常}
}// 正确做法:使用迭代器删除
Iterator<String> it = list.iterator();
while (it.hasNext()) {String item = it.next();if (item.equals("B")) {it.remove(); // 安全删除}
}

2. ​无法获取当前元素的索引

需要索引时,改用传统for循环:

String[] colors = {"红", "绿", "蓝"};for (int i = 0; i < colors.length; i++) {System.out.println("位置 " + i + ": " + colors[i]);
}

3. ​不能反向遍历集合

增强for循环只能从前向后遍历。需要逆序遍历时用传统循环:

for (int i = colors.length - 1; i >= 0; i--) {System.out.println(colors[i]);
}

4. ​底层集合必须实现Iterable接口

所有标准集合类(List、Set等)都实现了该接口,但自定义类需要自己实现。

// 自定义可迭代集合
class MyCollection<T> implements Iterable<T> {// ...必须实现iterator()方法...
}

💡 高级技巧:多维数组遍历

增强for循环同样适用于多维数组,让嵌套遍历更清晰:

int[][] matrix = {{1, 2, 3},{4, 5, 6},{7, 8, 9}
};// 外层遍历每一行
for (int[] row : matrix) {// 内层遍历当前行的每个元素for (int num : row) {System.out.print(num + " ");}System.out.println(); // 换行
}

🔍 增强for循环的工作原理

增强for循环在底层会被编译器转换为迭代器或普通for循环:

// 源码
for (String item : list) {System.out.println(item);
}// 编译后大致等效
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {String item = iterator.next();System.out.println(item);
}

常见问题解答

❓ 增强for循环性能比普通for循环差吗?

对于数组遍历,两者性能几乎相同(编译器会优化)。集合遍历时,增强for循环略慢于传统for循环,但在大多数场景下差异可以忽略不计,应优先考虑代码可读性。

❓ 可以在增强for循环中使用break和continue吗?

可以,与普通循环行为一致:

for (String item : list) {if (item.equals("跳过")) continue;if (item.equals("停止")) break;System.out.println(item);
}

❓ 所有集合都能使用增强for循环吗?

只要集合实现了Iterable接口(所有Java标准集合类都实现了),就可以使用增强for循环。

总结:何时使用增强for循环?

✅ ​推荐使用场景​:

  • 遍历数组或集合所有元素
  • 不需要修改集合结构
  • 不需要知道当前元素的索引
  • 追求代码简洁性和可读性

❌ ​避免使用场景​:

  • 遍历时需要增删元素
  • 需要知道当前元素的位置索引
  • 需要控制遍历方向(如倒序遍历)
  • 需要跳步访问元素(如隔一个遍历一次)

结语

增强for循环是Java提供的语法糖,可以让遍历代码更简洁、更安全。就像诗人用精炼的语言表达复杂情感,程序员用增强for循环表达简洁的遍历逻辑。记住它就像记住:"​对于每一个元素,我要做什么​"。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93712.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OLAP】trino安装和基本使用

目录 ​一、概述 1.1Trino不是什么 1.2Trino是什么 二、Trino特点 三、Trino架构 3.1架构和服务节点 3.2Trino数据模型 四、Trino安装部署 4.1配置JDK 4.2单机版&#xff08;Coordinator和Worker同进程&#xff09; 4.2.1启动服务 4.2.2下载客户端 五、配置HTTPS&…

如何写出更清晰易读的布尔逻辑判断?

列编码技巧和规范&#xff0c;来降低逻辑的“认知负荷”。成功的实践&#xff0c;必须系统性地涵盖五大关键策略&#xff1a;采用有意义的变量名进行封装、将复杂的判断拆解为独立的函数、优先使用“肯定式”而非“否定式”逻辑、利用括号明确运算的优先级、以及运用德摩根定律…

新手向:Java方向讲解

从诺基亚塞班到阿里双11&#xff0c;从安卓应用到华尔街交易&#xff0c;Java用一行System.out.println()征服了数字世界1998年&#xff0c;诺基亚在塞班系统上首次采用Java ME技术&#xff0c;让手机具备了运行应用程序的能力&#xff0c;开启了移动互联网的序幕。当时的Java开…

视觉图像界面设计【QT-creator高级编程 - 01】图像显如何保证跟随主窗口变化,且保留必要的设定窗口

前言&#xff1a;问题&#xff0c;显示图像的时候&#xff0c;按最大窗口&#xff0c;图片窗口不跟着变大&#xff0c;还有&#xff0c;右边那些设置控件都没有动解决&#xff1a;步骤1&#xff1a;1️⃣ 让 graphicsView 自动占满在 Qt Creator 中选中 graphicsView_7 / 12 / …

pair之于vector、queue(vector<pair<int,int>>)

1、vector&#xff1c;pair&#xff1c;int,int&#xff1e;&#xff1e; 和 Map 的异同点map&#xff1a;会对插入的元素按键Key&#xff0c;自动排序&#xff0c;而且键Key不允许重复&#xff1b;vector&#xff1a;的这种用法不会自动排序&#xff0c;而且允许重复。2、queu…

从合规到卓越:全星QMS如何成为制造企业的质量战略引擎

从合规到卓越&#xff1a;全星质量管理QMS软件系统如何成为制造企业的质量战略引擎 全星质量管理QMS软件系统凭借其高度定制化、智能化、全流程覆盖等核心优势&#xff0c;已在汽车制造、电子、医疗、航空航天等多个高端制造领域实现领先性应用&#xff0c;显著提升了企业的质…

按键及消抖

方法一&#xff1a;延时阻塞key.c:#include "key.h" #include "delay.h"//初始化GPIO void key_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟//调用GPIO初始化函数…

什么是接口?PHP如何使用 SessionHandlerInterface 接口实现Session自定义会话数据存储

在面向对象编程中&#xff0c;接口&#xff08;Interface&#xff09;作为类与类之间的契约规范&#xff0c;定义了实现类必须遵守的方法签名集合&#xff0c;却不包含具体实现细节。这种抽象机制通过强制统一的方法命名和参数结构&#xff0c;实现了代码的解耦与多态性&#x…

健身房预约系统SSM+Mybatis-plus实现(二、增删改查的具体实现)

文章目录一、环境搭建二、用户管理页面&#xff08;纯展示无事件操作&#xff09;0.三步走1.查询表单&#xff08;1&#xff09;书写页面代码 &#xff1a;&#xff08;2&#xff09;对应的js部分创建对象数据模型的绑定部分&#xff1a;&#xff08;3&#xff09;引入需要的库…

在IAR Embedded Workbench for Arm中实现NXP S32K3安全调试

随着汽车电子系统变得越来越智能&#xff0c;对功能安全&#xff08;Safety&#xff09;的要求越来越高&#xff0c;同时信息安全&#xff08;Security&#xff09;也越来越被关注&#xff0c;安全调试&#xff08;Secure Debug&#xff09;机制已成为一个重要的信息安全特性。…

Vue实例中的其他属性【5】

目录1.计算属性&#xff1a;1.概述&#xff1a;2.语法特点&#xff1a;3.案例&#xff1a;案例1&#xff1a;案例2&#xff1a;案例3&#xff1a;4.总结&#xff1a;5.get函数什么时候执行&#xff1f;6.注意:2.监视属性&#xff1a;1.概述&#xff1a; 2.用法&#xff1a;1.监…

C++入门自学Day11-- String, Vector, List 复习

往期内容回顾 List类型的自实现 List类型&#xff08;初识&#xff09; Vector类的自实现 Vector类&#xff08;注意事项&#xff09; 初识Vector String类的自实现 String类的使用&#xff08;续&#xff09; String类&#xff08;续&#xff09; String类&#xff08;初识&…

JavaScript性能优化实战(三):DOM操作性能优化

想象一下&#xff0c;你正在精心布置一个豪华蛋糕&#xff08;你的网页&#xff09;&#xff0c;每次添加一颗草莓&#xff08;DOM元素&#xff09;都要把整个蛋糕从冰箱拿出来、放回去&#xff08;重排重绘&#xff09;&#xff0c;来来回回几十次&#xff0c;不仅效率低下&am…

【力扣】面试经典150题总结02-双指针、滑动窗口

1.验证回文串&#xff08;简单&#xff09;用toLowerCase()转为小写字母&#xff0c;然后前后指针向中间进行比对。2.判断子序列&#xff08;简单&#xff09;两个指针一个指向长字符串&#xff0c;另一个指向短字符串。匹配就都1&#xff0c;不匹配就将长字符串指针1。长字符串…

MQ迁移方案

以下是完整的MQ迁移方案设计&#xff0c;涵盖同构/异构迁移、零丢失保障、灰度切换等关键环节&#xff0c;适用于Kafka、RabbitMQ、RocketMQ等主流消息队列&#xff1a;​一、迁移方案选型矩阵​​场景​​适用方案​​技术实现​​优缺点​​同集群版本升级​滚动重启 协议兼…

RAG 分块中表格填补简明示例:Markdown、HTML、Excel、Doc

表格填补是RAG分块中常见的需求&#xff0c;但不同格式的表格处理方式有所不同。本文将对 Markdown、HTML、Excel 的合并单元格进行说明&#xff0c;并给出 Python 示例&#xff0c;演示如何解析和填补。1. Markdown 表格Markdown 只能用空值表示合并单元格。&#xff08;只有列…

IDEA创建一个VUE项目

由于新手学习VUE&#xff0c;所以使用手动初始化项目 步骤&#xff1a; 创建项目文件夹&#xff1a;在 IDEA 中点击 File > New > Project&#xff0c;选择 Empty Project&#xff0c;指定项目路径。初始化 npm&#xff1a;在终端中&#xff1a;npm init -y安装vue&#…

Chrome插件开发实战:todoList 插件

以下是一个适合小团队自用的 Chrome TodoList 插件开发示例&#xff0c;包含基础功能&#xff08;增删改查、本地存储、统计&#xff09;和简洁的交互设计。代码结构清晰&#xff0c;适合新手学习或快速上手。 一、项目准备 创建插件项目目录 todo-list-extension&#xff0c;…

【Redis数据库开启SSL加密】【小白指南】【生产环境可用】附带Docker服务器配置和python连接Redis数据库代码(加密通讯版)

【Redis数据库开启SSL加密】【填坑指南】附带服务器配置和python连接测试代码 本教程转为小白提供设置Redis安全访问&#xff0c;自签名证书进行安全访问你的Redis数据库&#xff0c;轻松实现安全访问和保护数据库不被非法入侵。 本文原创&#xff0c;转载请注明出处&#xff0…

笔记本电脑键盘失灵【已解决】

配置环境硬件详情笔记本电脑联想拯救者y7000 2019 PG0&#xff08;已更新为win11&#xff09;外接键盘colorful ckb-p100问题今天笔记本开机后&#xff0c;进入登录页面输入密码&#xff0c;突然发现笔记本自带键盘&#xff08;我通常不用外接键盘&#xff09;的键失灵了&#…