当前位置: 首页 > news >正文

Java中for与foreach

在 Java 里,for循环和foreach循环(也就是增强型for循环)存在一些明显的不同。下面为你详细介绍它们的主要区别:

1. 语法结构

  • 普通for循环:这种循环的语法结构较为灵活,你可以自定义循环的初始条件、终止条件以及迭代方式。
for (初始化; 终止条件; 迭代操作) {// 循环体
}
  • foreach循环:它的语法更为简洁,不过只能用于遍历数组或者实现了Iterable接口的集合。
for (元素类型 变量名 : 数组或集合) {// 循环体
}

2. 访问索引

  • 普通for循环:在循环过程中,你能够直接访问当前元素的索引。
String[] names = {"Alice", "Bob", "Charlie"};
for (int i = 0; i < names.length; i++) {System.out.println("索引 " + i + ": " + names[i]);
}
  • foreach循环:该循环不会暴露当前元素的索引,你只能直接访问元素的值。
String[] names = {"Alice", "Bob", "Charlie"};
for (String name : names) {System.out.println(name); // 无法直接获取当前元素的索引
}

3. 修改集合

  • 普通for循环:你可以在循环里对集合的元素进行修改,甚至删除元素(不过在删除元素时需要小心,避免出现ConcurrentModificationException异常)。
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
for (int i = 0; i < list.size(); i++) {if (list.get(i).equals("B")) {list.remove(i); // 删除元素}
}
  • foreach循环:在循环过程中不能对集合的结构进行修改(比如添加或删除元素),否则会抛出ConcurrentModificationException异常。不过,你可以修改元素的属性(如果元素是对象的话)。
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
for (String element : list) {list.remove(element); // 错误!会抛出 ConcurrentModificationException
}

4. 适用范围

  • 普通for循环:适用于各种场景,尤其适合需要自定义循环条件的情况,例如反向遍历、跳跃遍历等。
// 反向遍历数组
for (int i = names.length - 1; i >= 0; i--) {System.out.println(names[i]);
}
  • foreach循环:适用于简单的遍历场景,能够让代码更加简洁易读。
// 遍历集合
for (String name : names) {System.out.println(name);
}

5. 性能表现

  • 普通for循环:在遍历数组时,普通for循环的性能和foreach循环相近。但如果是遍历实现了RandomAccess接口的集合(如ArrayList),普通for循环通过索引访问元素的效率会更高。
  • foreach循环:遍历集合时,foreach循环实际上是通过迭代器(Iterator)来实现的,因此在性能上和使用迭代器的普通for循环相当。不过,由于它的语法更简洁,所以在实际开发中更受青睐。

总结

特性普通for循环foreach循环
语法复杂度较高较低
索引访问支持不支持
修改集合结构需谨慎操作不允许,会抛出异常
适用范围灵活,适用于各种场景仅适用于遍历
代码可读性较低(循环逻辑复杂时)较高

一般来说,如果你需要访问索引或者修改集合结构,建议使用普通for循环;如果只是简单地遍历集合或数组,使用foreach循环会让你的代码更加简洁。

http://www.lqws.cn/news/576919.html

相关文章:

  • python+uniapp基于微信小程序的生鲜订购系统nodejs+java
  • 基于uniapp的老年皮肤健康管理微信小程序平台(源码+论文+部署+安装+售后)
  • JAVA八股文:异常有哪些种类,可以举几个例子吗?Throwable类有哪些常见方法?
  • HTML5 实现的圣诞主题网站源码,使用了 HTML5 和 CSS3 技术,界面美观、节日氛围浓厚。
  • 湖北理元理律师事务所债务解法:从法律技术到生活重建
  • 车载Tier1 supplier梳理
  • VMware vSphere 9与ESXi 9正式发布:云原生与AI驱动的虚拟化平台革新
  • Nginx反向代理与缓存功能
  • 【软考高项论文】信息系统项目的资源管理
  • GitHub Actions配置python flake8和black
  • 企业流程知识:《企业再造:企业革命的宣言》
  • 大语言模型 API 进阶指南:DeepSeek 与 Qwen 的深度应用与封装实践
  • 【Linux】Vi编辑器保存和退出
  • AIGC检测系统升级后的AI内容识别机制与系统性降重策略研究(三阶段降重法)
  • Windows桌面上的「了解此图片」怎么弄掉?
  • Day2 音频基础知识
  • HarmonyOS NEXT仓颉开发语言实战案例:电影App
  • CAU数据挖掘 支持向量机
  • 基于 SpringBoot+Vue.js 诗词鉴赏论坛交流平台设计与实现7000字论文实现
  • android APP 小米商店上架失败之《获取应用列表权限》
  • Flutter插件ios_pod
  • 地级市-固定资产投资数据(2000-2023年)-实证数据
  • 气候智能体:AI如何重构人类应对气候危机的决策体系?
  • LabVIEW荧光微管图像模拟
  • Swift 实现二叉树垂直遍历:LeetCode 314 完整解析与实战示例
  • Pytest自动化测试框架入门?
  • Nordic空中升级OTA[NRF52832蓝牙OTA]
  • 免费文件管理 智能转换GC-Prevue:PDF 转 Word 多种格式 一键完成
  • 重构老项目不再“踩雷”:飞算JavaAI的本地化智能合并实战
  • Java基础(六):数组全面解析