Java | 增强for底层工作机制

✍🏼作者:周棋洛,bilidown开发者。
♉星座:金牛座
🏠主页:我的个人网站
🌐关键:Java 增强for 工作机制

在这里插入图片描述

目录

  • 引言
  • 增强for循环语法
  • 增强for工作机制探究
  • 简单总结
    • 1.对于实现了Iterable接口的集合
    • 2.对于数组
    • 个人理解
  • 彩蛋:forEach方法

引言

Java中的增强for循环(也称为for-each循环)是对集合(如数组,Iterable接口的实现类)进行遍历的一种简便方法。

在Java中,增强for循环是一种语法糖。本文简单探究一下它的底层工作机制。

在这里插入图片描述

增强for循环语法

增强for循环的语法如下:

for (ElementType element : collection) {// 使用element进行操作...
}

在这里插入图片描述

增强for工作机制探究

编写并编译如下测试代码,我们分别看看数组和集合的增强for循环编译后的字节码文件。

public static void main(String[] args) {// arr testString[] arr = {"a", "r", "r"};for (String str : arr) {System.out.print(str);}System.out.println();// list testList<String> list = Arrays.asList("l", "i", "s", "t");for (String str : list) {System.out.print(str);}
}

编译后字节码如下:

public static void main(String[] args) {String[] arr = new String[]{"a", "r", "r"};String[] var2 = arr;int var3 = arr.length;for(int var4 = 0; var4 < var3; ++var4) {String str = var2[var4];System.out.print(str);}System.out.println();List<String> list = Arrays.asList("l", "i", "s", "t");Iterator var7 = list.iterator();while(var7.hasNext()) {String str = (String)var7.next();System.out.print(str);}
}

可以发现:

  • 如果是遍历数组,则增强for在编译时,会被转换为基础for循环。
String[] arr = {"a", "r", "r"};// 增强for循环
for (String str : arr) {System.out.print(str);
}// 等价标准索引循环
for (int i = 0; i < arr.length; i++) {String str = arr[i];System.out.println(str);
}
  • 如果是遍历集合,则增强for在编译时,会被转换为标准迭代器循环。
List<String> list = Arrays.asList("l", "i", "s", "t");// 增强for循环
for (String item : list) {System.out.println(item);
}// 等价标准迭代器循环
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {String item = it.next();System.out.println(item);
}

在这里插入图片描述

简单总结

1.对于实现了Iterable接口的集合

所有实现了java.lang.Iterable接口的集合类(如ArrayListHashSet等)都可以使用增强for循环。Iterable接口包含了一个iterator()方法,该方法返回一个实现java.util.Iterator接口的对象。Iterator接口中提供了hasNext()next()方法,用于遍历集合中的元素。

在这里插入图片描述

工作流程如下:

  1. 调用集合的iterator()方法获取迭代器对象。
  2. 调用迭代器的hasNext()方法检查是否有更多元素。
  3. 调用迭代器的next()方法获取下一个元素。

2.对于数组

数组没有实现Iterable接口,但增强for循环对数组也进行了支持。在编译阶段,增强for循环会被转换为基于索引的普通for循环。

工作流程如下:

  1. 初始化一个索引变量,从0开始。
  2. 每次循环时,检查索引是否小于数组的长度。
  3. 使用索引访问数组元素。

个人理解

在Java中,增强for循环是一种语法糖,用于遍历数组或集合中的元素。它的底层实现依赖于迭代器机制(对于集合)或基于索引的循环(对于数组)。

在编译阶段,增强for循环会被转换为相应的标准循环结构。这个机制使得增强for循环既简洁又高效。

彩蛋:forEach方法

看下面的结构图,forEach是java中Iterable接口的一个默认方法,用于遍历集合(或实现了Iterable接口的类)中的每个元素,并对每个元素执行指定的操作。

forEach方法接受一个函数式接口作为参数,这个函数式接口通常是一个lambda表达式或方法引用,用于对集合中的每个元素执行操作。

在这里插入图片描述

这个方法是java8引入的,它提供了一种函数式,更简洁的遍历集合的方式。

在这里插入图片描述

虽然一些情况下,增强for和forEach方法可以互换使用,但它们在语法上和底层实现上是不同的。

语法上:增强for循环用于数组和集合的遍历,并且它是一种语言级别的循环结构。而forEach方法是集合类提供的一个方法,用于遍历集合,它是一个方法调用,需要传递一个函数式接口作为参数。

底层实现上:增强for循环在编译时会被转换为标准的迭代器或基于索引的循环,而forEach方法则是在集合类内部实现了对每个元素的遍历。

default void forEach(Consumer<? super T> action) {Objects.requireNonNull(action);for (T t : this) {action.accept(t);}}

在这里插入图片描述

就写到这里吧,下篇见。

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

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

相关文章

【Git教程】(十九)合并小型项目 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 合并小型项目 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现 在项目的初始阶段&#xff0c;往往需要针对重要的设计决策和技术实现原型实验。当原型评估结束后&#xff0c;需要将那些成功的原型合并起来称为整个项目的初始版本。 在这样的情景中&#xff0c;各个原…

Hadoop Java API操作 及读取序列化文件(04-05-06)

针对于04-05-06班级整合。 1.创建java项目 2.修改pom.xml文件 添加依赖 <dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.1.4</version></dependenc…

RocketMQ:新增consumer消费组group从最新消息开始消费skip last offset message

场景 想创建一个新的consumer去消费一个已经再使用的topic时&#xff0c;默认情况下会从topic中的第一条消息开始消费&#xff0c;大多数情况是需要从最新的消息开始。然后再使用CONSUME_FROM_LAST_OFFSET设置时并不会对新的consumer生效&#xff0c;它只是在停用consumer重新启…

【MySQL】表的增删改查 | CRUD | 新增 | 查询 | 修改 | 删除 | 数据库约束

文章目录 表的增删改查一、CRUD1.新增&#xff08;Create&#xff09;1.插入多行2.指定列多行插入3.插入datetime类型4.插入当前时间5.插入查询的结果 2.查询&#xff08;Retrieve&#xff09;1.全列查询 *2.指定列查询3.查询字段为表达式4.指定别名 as5.去重 distinct6.排序 o…

算法分析与设计复习__递归方程与分治

总结自&#xff1a;【算法设计与分析】期末考试突击课_哔哩哔哩_bilibili 1.递归&#xff0c;递归方程 1.1递归条件: 1.一个问题的解可以分解为几个子问题的解&#xff1b; 2.这个问题与分解之后的子问题&#xff0c;除了数据规模不同&#xff0c;求解思路完全一样; 3.存在…

Python从0到100(二十四):正则表达式的应用

正则表达式是一种用于字符串搜索和操作的强大工具&#xff0c;它允许你使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在编程中&#xff0c;正则表达式被广泛应用于文本处理&#xff0c;如模式搜索、文本替换、字符串验证等。 1.正则表达式基础 正则表达式由一…

Edge(微软)——一款充满创新精神的浏览器

随着科技的不断进步&#xff0c;互联网浏览器已经成为我们日常生活中不可或缺的工具。在这个领域&#xff0c;微软Edge作为一款新型的浏览器&#xff0c;凭借其独特的功能和优秀的性能&#xff0c;逐渐在市场上占据了一席之地。本文将深入探索微软Edge的特点、优势以及它如何改…

【MySQL 数据宝典】【事务锁】- 002 事务控制的演进

一、事务处理思路 1.1 排队 排队处理是事务管理最简单的方法&#xff0c;就是完全顺序执行所有事务的数据库操作&#xff0c;不需要加锁&#xff0c;简单的说就是全局排队。序列化执行所有的事务单元&#xff0c;数据库某个时刻只处理一个事务操作&#xff0c;特点是强一致性…

测缝计测量的是实际缝宽吗?

在土木工程中&#xff0c;测缝计作为一种重要的监测工具&#xff0c;广泛应用于桥梁、隧道、大坝等大型结构中&#xff0c;用以测量和监控结构接缝或裂缝的实际宽度变化。然而&#xff0c;有些人可能会产生疑问&#xff1a;测缝计测量的是实际缝宽吗?本文将对这一问题进行深入…

六西格玛管理培训对企业有哪些实际帮助?

当下&#xff0c;企业要想脱颖而出&#xff0c;不仅要有创新思维和敏锐的市场洞察力&#xff0c;更要有高效的管理体系和严谨的质量控制手段。而六西格玛管理培训正是这样一项能够帮助企业实现提质增效、提升竞争力的关键举措。那么&#xff0c;六西格玛管理培训对企业究竟有哪…

亲子失和最大的内耗是:家长总是“说硬话,办软事”!

一声爸妈&#xff0c;一辈子的责任&#xff0c;操不完的心、做不完的事。 然而&#xff0c;爱太满&#xff0c;注定会溢出。爱有边界&#xff0c;我们是父母&#xff0c;更是自己&#xff01; 01 前些时候悠悠起床又开始混账了&#xff01; 气愤的是&#xff0c;周末休息那…

MES系统在电线电缆行业生产上的应用

MES系统在线缆行业的应用可以带来多重价值&#xff0c;包括提高生产效率、降低生产成本、提高产品质量、优化库存管理、改善生产环境和提高企业竞争力等方面。因此&#xff0c;在电线电缆行业中广泛应用MES系统可以提高企业的经济效益和社会效益&#xff0c;推动企业发展和行业…