java 增强型for循环 详解
Java 增强型 for 循环(Enhanced for Loop)详解
增强型 for
循环(也称为 “for-each” 循环)是 Java 从 JDK 5 开始引入的一种便捷循环语法,旨在简化对数组或集合类的迭代操作。
1. 基本语法
语法格式
for (类型 变量 : 迭代对象) {// 循环体
}
类型
:迭代对象中元素的类型。变量
:每次迭代时,存储当前元素的变量。迭代对象
:数组或实现了Iterable
接口的集合(如List
、Set
等)。
2. 使用示例
2.1 遍历数组
public class EnhancedForArray {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5};for (int num : numbers) {System.out.println(num); // 输出:1, 2, 3, 4, 5}}
}
2.2 遍历集合
import java.util.ArrayList;
import java.util.List;public class EnhancedForList {public static void main(String[] args) {List<String> fruits = new ArrayList<>();fruits.add("Apple");fruits.add("Banana");fruits.add("Cherry");for (String fruit : fruits) {System.out.println(fruit); // 输出:Apple, Banana, Cherry}}
}
3. 特性与限制
3.1 特性
-
简洁性:
- 不需要手动管理索引或迭代器,代码更易读。
- 对比传统
for
循环,不需要获取数组长度或调用集合的迭代器。
-
适用性广泛:
- 可用于数组、
List
、Set
、Map
(遍历entrySet()
、keySet()
或values()
)。
- 可用于数组、
3.2 限制
-
无法修改集合结构:
-
增强型
for
循环中,不能直接对集合进行add
或remove
操作,否则会抛出ConcurrentModificationException
。 -
示例:
List<String> list = new ArrayList<>(); list.add("A"); list.add("B");for (String s : list) {if (s.equals("A")) {list.remove(s); // 会抛出异常} }
-
如果需要修改集合结构,可以使用 迭代器:
Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) {String s = iterator.next();if (s.equals("A")) {iterator.remove(); // 安全地删除元素} }
-
-
无法访问索引:
- 增强型
for
循环中无法直接获取元素的索引。如果需要索引,需使用传统for
循环:String[] fruits = {"Apple", "Banana", "Cherry"}; for (int i = 0; i < fruits.length; i++) {System.out.println("Index " + i + ": " + fruits[i]); }
- 增强型
-
只支持顺序访问:
- 适用于
Iterable
接口的集合(如List
、Set
),不适用于需要随机访问的场景。
- 适用于
4. 遍历 Map
的增强型 for
4.1 遍历 keySet
遍历 Map
的所有键:
import java.util.HashMap;
import java.util.Map;public class EnhancedForMap {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("A", 1);map.put("B", 2);map.put("C", 3);for (String key : map.keySet()) {System.out.println("Key: " + key + ", Value: " + map.get(key));}}
}
4.2 遍历 entrySet
更高效地同时遍历键和值:
for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
5. 适用场景
-
遍历数组:
- 对于大小已知且不需要修改的数组,增强型
for
是最佳选择。
- 对于大小已知且不需要修改的数组,增强型
-
遍历集合:
- 遍历
List
、Set
等集合,尤其是当集合不需要修改时。
- 遍历
-
遍历
Map
:- 使用
entrySet()
时,增强型for
简洁而高效。
- 使用
-
简化代码:
- 避免手动管理索引或迭代器。
6. 常见问题
6.1 为什么增强型 for
循环不能修改集合?
增强型 for
底层使用了 迭代器 来遍历集合,如果直接修改集合结构(如添加或删除元素),会导致迭代器失效,抛出 ConcurrentModificationException
。
6.2 如何在增强型 for
中访问索引?
可以在增强型 for
中手动维护索引:
String[] fruits = {"Apple", "Banana", "Cherry"};
int index = 0;
for (String fruit : fruits) {System.out.println("Index " + index + ": " + fruit);index++;
}
7. 底层实现
增强型 for
循环的本质是使用了 迭代器 来实现的。
伪代码
对于 Iterable
对象:
for (Type element : collection) {Iterator<Type> it = collection.iterator();while (it.hasNext()) {Type element = it.next();// 循环体}
}
对于数组:
for (Type element : array) {for (int i = 0; i < array.length; i++) {Type element = array[i];// 循环体}
}
8. 总结
优点
- 简化代码:适合大多数迭代场景,避免手动处理索引和迭代器。
- 可读性高:语法简洁,专注于元素处理。
缺点
- 不能直接操作索引。
- 不支持修改集合结构。
- 适用于顺序访问,不适合随机访问场景。
增强型 for
循环是 Java 中对迭代器模式的进一步抽象,它让遍历变得更加简单、高效,是开发中非常常用的工具。
相关文章:
java 增强型for循环 详解
Java 增强型 for 循环(Enhanced for Loop)详解 增强型 for 循环(也称为 “for-each” 循环)是 Java 从 JDK 5 开始引入的一种便捷循环语法,旨在简化对数组或集合类的迭代操作。 1. 基本语法 语法格式 for (类型 变量…...
浪潮云启操作系统(InLinux) bcache宕机问题分析
前言 本文以一次真实的内核宕机问题为切入点,结合实际操作案例,详细展示了如何利用工具 crash对内核转储(kdump)进行深入分析和调试的方法。通过对崩溃日志的解读、函数调用栈的梳理、关键地址的定位以及代码逻辑的排查ÿ…...
038集——quadtree(CAD—C#二次开发入门)
效果如下: using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using System; using System.Collections.Generic; using System.Linq; using System.T…...
备赛蓝桥杯--算法题目(1)
1. 链表求和 . - 力扣(LeetCode) class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode *head nullptr, *tail nullptr;int carry 0;while (l1 || l2) {int n1 l1 ? l1->val: 0;int n2 l2 ? l2->val:…...
机器学习100道经典面试题库(二)
机器学习100道经典面试题库(31-60) 在大规模的语料中,挖掘词的相关性是一个重要的问题。以下哪一个信息不能用于确定两个词的相关性。 A、互信息 B、最大熵 C、卡方检验 D、最大似然比 答案:B 解析:最大熵代表了…...
Unet++改进37:添加KACNConvNDLayer(2024最新改进方法)
本文内容:添加KACNConvNDLayer 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 1.步骤一 新建block/kacn_conv.py文件,添加如下代码: import torch import torch.nn as nn##源码地址:https://github.com/SynodicMonth/ChebyKAN class KACNConvNDLaye…...
基于 Levenberg - Marquardt 法的 BP 网络学习改进算法详解
基于 Levenberg - Marquardt 法的 BP 网络学习改进算法详解 一、引言 BP(Back Propagation)神经网络在众多领域有着广泛应用,但传统 BP 算法存在收敛速度慢、易陷入局部最优等问题。Levenberg - Marquardt(LM)算法作…...
MySQL 8.0与PostgreSQL 15.8的性能对比
根据搜索结果,以下是MySQL 8.0与PostgreSQL 15.8的性能对比: MySQL 8.0性能特点: MySQL在处理大量读操作时表现出色,其存储引擎InnoDB提供了行级锁定和高效的事务处理,适用于并发读取的场景。MySQL通过查询缓存来提高读…...
qt连接postgres数据库时 setConnectOptions函数用法
连接选项,而这些选项没有直接的方法对应,你可能需要采用以下策略之一: 由于Qt SQL API的限制,你可能需要采用一些变通方法或查阅相关文档和社区资源以获取最新的信息和最佳实践。如果你确实需要设置特定的连接选项,并且…...
MySQL45讲 第二十七讲 主库故障应对:从库切换策略与 GTID 详解——阅读总结
文章目录 MySQL45讲 第二十七讲 主库故障应对:从库切换策略与 GTID 详解一、一主多从架构与主备切换的挑战(一)一主多从基本结构(二)主备切换的复杂性 二、基于位点的主备切换(一)同步位点的概念…...
JavaWeb笔记整理——Spring Task、WebSocket
目录 SpringTask cron表达式 WebSocket SpringTask cron表达式 WebSocket...
基于SpringBoot+RabbitMQ完成应⽤通信
前言: 经过上面俩章学习,我们已经知道Rabbit的使用方式RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)-CSDN博客作为⼀个消息队列,RabbitMQ也可以⽤作应⽤程…...
Flutter踩坑记录(一)debug运行生成的项目,不能手动点击运行
问题 IOS14设备,切后台划掉,二次启动崩溃。 原因 IOS14以上 flutter 不支持debugger模式下的二次启动 。 要二次启动需要以release方式编译工程安装至手机。 操作步骤 清理项目:在命令行中运行flutter clean来清理之前的构建文件。重新构…...
React的hook✅
为什么hook必须在组件内的顶层声明? 这是为了确保每次组件渲染时,Hooks 的调用顺序保持一致。React利用 hook 的调用顺序来跟踪各个 hook 的状态。每当一个函数组件被渲染时,所有的 hook 调用都是按照从上到下的顺序依次执行的。React 内部会…...
2024.5 AAAiGLaM:通过邻域分区和生成子图编码对领域知识图谱对齐的大型语言模型进行微调
GLaM: Fine-Tuning Large Language Models for Domain Knowledge Graph Alignment via Neighborhood Partitioning and Generative Subgraph Encoding 问题 如何将特定领域知识图谱直接整合进大语言模型(LLM)的表示中,以提高其在图数据上自…...
从熟练Python到入门学习C++(record 6)
基础之基础之最后一节-结构体 1.结构体的定义 结构体相对于自定义的一种新的变量类型。 四种定义方式,推荐第一种;第四种适合大量定义,也适合查找; #include <iostream> using namespace std; #include <string.h>…...
jenkins的安装(War包安装)
Jenkins是一个开源的持续集成工具,基于Java开发,主要用于监控持续的软件版本发布和测试项目。 它提供了一个开放易用的平台,使软件项目能够实现持续集成。Jenkins的功能包括持续的软件版本发布和测试项目,以及监控外部调用执行…...
WPS 加载项开发说明wpsjs
wpsjs几个常用的CMD命令: 1.打开cmd输入命令测试版本号 npm -v 2.首次安装nodejs,npm默认国外镜像,包下载较慢时,可切换到国内镜像 //下载速度较慢时可切换国内镜像 npm config set registry https://registry.npmmirror.com …...
【Anomaly Detection论文阅读记录】PaDiM与PatchCore模型的区别与联系
PaDiM与PatchCore模型的区别与联系 背景介绍 PADIM(Pretrained Anomaly Detection via Image Matching)和 PatchCore 都是基于深度学习的异常检测方法,主要用于图像异常检测,尤其是在无监督学习设置下。 PADIM 是一种通过利用预训练的视觉模型(例如,ImageNet预训练的卷…...
uni-app Vue3语法实现微信小程序样式穿透uview-plus框架
1 问题描述 我在用 uni-app vue3 语法开发微信小程序时,在项目中使用了 uview-plus 这一开源 UI 框架。在使用 up-text 组件时,想要给它添加一些样式,之前了解到微信小程序存在样式隔离的问题,也在uview-plus官网-注意事项中找到…...
K8S基础概念和环境搭建
K8S的基础概念 1. 什么是K8S K8S的全称是Kubernetes K8S是一个开源的容器编排平台,用于自动化部署、扩缩、管理容器化应用程序。 2. 集群和节点 集群:K8S将多个机器统筹和管理起来,彼此保持通讯,这样的关系称之为集群。 节点…...
[服务器] 腾讯云服务器免费体验,成功部署网站
文章目录 概要整体架构流程概要 腾讯云服务器免费体验一个月。 整体架构流程 腾讯云服务器体验一个月, 选择预装 CentOS 7.5 首要最重要的是: 添加阿里云镜像。 不然国外源速度慢, 且容易失败。 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/li…...
vue中el-select 模糊查询下拉两种方式
第一种:先获取所有下拉数据再模糊查询,效果如下 1,页面代码:speciesList是种类列表List, speciesId 是speciesList里面对应的id,filterable是过滤查询标签 <el-form-item label"种类" prop"species…...
深入解析PostgreSQL中的PL/pgSQL语法
在数据库管理系统中,PostgreSQL因其强大的功能和稳定性而受到广泛欢迎。其中,PL/pgSQL作为PostgreSQL的过程化语言,为用户提供了更为灵活和强大的编程能力。本文将深入解析PL/pgSQL的语法,帮助读者更好地掌握这门语言,…...
Vue 3集成海康Web插件实现视频监控
🌈个人主页:前端青山 🔥系列专栏:组件封装篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来组件封装篇专栏内容:Vue 3集成海康Web插件实现视频监控 引言 最近在项目中使用了 Vue 3 结合海康Web插件来实…...
多目标优化算法:多目标蛇鹫优化算法(MOSBOA)求解DTLZ1-DTLZ9,提供完整MATLAB代码
一、蛇鹫优化算法 蛇鹫优化算法(Secretary Bird Optimization Algorithm,简称SBOA)由Youfa Fu等人于2024年4月发表在《Artificial Intelligence Review》期刊上的一种新型的元启发式算法。该算法旨在解决复杂工程优化问题,特别是…...
机器翻译基础与模型 之三:基于自注意力的模型
基于RNN和CNN的翻译模型,在处理文字序列时有个问题:它们对序列中不同位置之间的依赖关系的建模并不直接。以CNN的为例,如果要对长距离依赖进行描述,需要多层卷积操作,而且不同层之间信息传递也可能有损失,这…...
如何使用PCL处理ROS Bag文件中的点云数据并重新保存 ubuntu20.04
如何使用PCL处理ROS Bag文件中的点云数据并重新保存 要精确地处理ROS bag中的点云数据并使用PCL进行处理,再将处理后的数据保存回新的ROS bag文件,以下方案提供了详细、专业和严谨的步骤。 步骤 1: 环境设置 确保安装了ROS和PCL,并配置好环…...
背包问题(动态规划)
背包问题是一种组合优化的问题,它有多种变体,但最常见的两种是0/1背包问题和完全背包问题。 0/1背包问题 问题描述: 假设你有一个背包,背包的容量为W(可以是重量或者体积等度量),同时有n个物品…...
从0开始学习机器学习--Day26--聚类算法
无监督学习(Unsupervised learning and introduction) 监督学习问题的样本 无监督学习样本 如图,可以看到两者的区别在于无监督学习的样本是没有标签的,换言之就是无监督学习不会赋予主观上的判断,需要算法自己去探寻区别,第二张…...
做姓氏图的网站/七牛云
来源 | 腾讯知乎专栏作者 | AIoys(腾讯员工,后台工程师)项目文档和代码在此:github项目地址▌一、前言阅读本文的基础:我会认为你对BP神经网络有充分的了解,熟读过我上一篇文章,本文会大量引用上…...
海南网站建设哪里有/广点通和腾讯朋友圈广告区别
--loop循环用法 (输出1到10) declare v_num number(2) : 0; begin loopv_num : v_num 1;exit when v_num > 10;--上面退出循环也可以用下面3行/* if(v_num > 9) thenexit;end if;*/dbms_output.put_line(v_num); end loop; end;--while loop循环用法 (输出1到10) decl…...
网站上的用户注册怎么做的/seo先上排名后收费
概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强…” 面向过程编程最易被初学者接…...
济南集团网站建设方案/互联网广告优势
Android5.0中向我们介绍了一个全新的控件–CardView,从本质上看,可以将CardView看做是FrameLayout在自身之上添加了圆角和阴影效果。请注意:CardView被包装为一种布局,并且经常在ListView和RecyclerView的Item布局中,作…...
个人网站建设策划书/app推广方案怎么写
项目生命周期: (清除项目编译信息-clean)-- 编译(compile) -- 测试(test) -- 打包(package) -- 安装(install) -- 部署(deploy) clean:清理生命周期 compile ---> deploy:默认生命周期 site:站点生命…...
视频添加到wordpress/自己想开个网站怎么弄
讲师简介晁岳攀(鸟窝)百度,资深工程师 多次GopherChina大会讲师,极客时间专栏作者,Go微服务框架 rpcx 作者。演讲内容演讲主题:《Go泛型的实现、陷阱和应用场景》主题摘要:Go泛型2022年2月份就要…...