Java | 增强for底层工作机制

news2024/9/22 3:43:07

✍🏼作者:周棋洛,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 test
    String[] arr = {"a", "r", "r"};
    for (String str : arr) {
        System.out.print(str);
    }

    System.out.println();

    // list test
    List<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.coloradmin.cn/o/1678830.html

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

相关文章

LeetCode算法题:11. 盛最多水的容器(Java)(双指针问题总结)

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 提示&#xff1a; n height.length2 <…

寻求发展+兼顾陪读|企业高管赴美国乔治梅森大学做访问学者

E经理拟去美国访学&#xff0c;想达到3个目的&#xff1a;结合本专业方向&#xff0c;扩展至跨学科研究领域&#xff1b;考察市场&#xff0c;寻求新的发展契机&#xff1b;携孩子出国读书&#xff0c;兼顾陪读&#xff0c;并希望尽早出国。最终我们为其落实的乔治梅森大学访问…

AI预测体彩排3采取878定位大底=23策略+杀断组+杀组选+杀和尾+杀和值012缩水测试5月15日预测第1弹

昨天与一位玩排3的彩友通过视频直播的形式聊了下&#xff0c;受益匪浅&#xff0c;给我提供了一些比较有价值的建议&#xff0c;比如&#xff0c;对于878的定位策略&#xff0c;方向是没问题的&#xff0c;但是8783的话&#xff0c;还是缺乏一定的命中率&#xff0c;如果87823&…

做私域,该如何从公域向私域引流?

说到私域运营&#xff0c;很多人首先就会想到&#xff1a;私域流量。企业做私域&#xff0c;流量从哪来&#xff1f;该怎样去引流&#xff1f;又该如何保障私域流量的质量等一系列问题&#xff0c;都需要企业一一解决。所以&#xff0c;今天&#xff0c;我们就来探讨一下&#…

transformer通俗理解

transformer中最麻烦的encoder模块其实张量和矩阵的变化维度比较复杂。我感觉这篇文章讲的特别详细Q、K、V 与 Multi-Head Attention 多头注意力机制 - 知乎 我总结一下文章几个很重要的点吧&#xff01;算是我学的一点收获 1.什么是QKV&#xff1f; 2.怎么理解多头&#xff…

端口号查询进程PID

情况1&#xff1a;由于 idea 突然闪退&#xff0c;导致正在 debug 的 Java 进程没结束掉&#xff0c;端口还在占用&#xff0c;重新 debug 不了&#xff0c;所以需要到任务管理器把进程结束掉 但问题是如果当任务管理器进程同时有多个 Java 进程在运行&#xff08;而且名字一样…

万物皆可监控(shell脚本监控TIDB-DM和DSG同步状态)

监控的方式有很多&#xff0c;常用的有zabbix和prometheus平台&#xff0c;理论上都可以做到对有状态服务的监控&#xff0c;因为我个人对这两个监控平台不是很熟悉&#xff0c;所以一般喜欢使用shell脚本来做监控&#xff1b; 纯oracle 数据库的监控推荐使用EMCC&#xff0c;…

基于火山引擎云搜索的混合搜索实战

在搜索应用中&#xff0c;传统的 Keyword Search 一直是主要的搜索方法&#xff0c;它适合精确匹配查询的场景&#xff0c;能够提供低延迟和良好的结果可解释性&#xff0c;但是 Keyword Search 并没有考虑上下文信息&#xff0c;可能产生不相关的结果。最近几年&#xff0c;基…

淘系淘宝订单详情api接口(订单详情,订单列表,出售中,库存等属性)

淘系淘宝订单详情api接口&#xff08;订单详情&#xff0c;订单列表&#xff0c;出售中&#xff0c;库存等属性&#xff09;

免费泛域名证书申请

通配符证书是一种 SSL/TLS 证书&#xff0c;可用于保护多个域&#xff08;主机&#xff09;&#xff0c;由域名字段中的通配符 (*) 指示。 如果您有很多需要保护的域或子域&#xff0c;这会很有帮助&#xff0c;因为它可以节省您的时间和金钱。 本文将讨论通配符证书、它们的工…

【Win】如何在Windows隐藏安装的程序

由于维护人员或用户可能无意中通过“程序和功能”选项删除对业务至关重要的软件&#xff0c;这导致服务中断或安全风险。为了防止此类情况发生&#xff0c;确保只有授权的用户才能访问和管理系统中的程序。为了实现这一目标&#xff0c;我们将探讨如何在Windows操作系统中隐藏特…

使用高防IP是应对网络安全的重要措施

使用高防IP&#xff08;High Defense IP&#xff09;在现代网络环境中显得尤为重要&#xff0c;这主要源于以下几个方面的原因&#xff1a; 一、网络安全形势严峻 随着互联网的快速发展&#xff0c;网络安全问题日益突出。各种网络攻击手段层出不穷&#xff0c;如分布式拒绝服…

R语言基础--文件读写

From生物技能树&#xff08;R第五节&#xff09; 文章目录 一、文件读写1.注意用project管理工作目录2、文件读取1、读取.txt文件2、读取.csv文件注意&#xff1a;数据框不允许重复的行名 3.数据框的导出4.读取文件的其他方式(用于读取/导出文件的R包)--经验1.base2.readr3.dat…

【会议征稿】2024年机器人前沿技术与创新国际会议(FTIR 2024, 7/19-21)

2024年机器人前沿技术与创新国际会议&#xff08;FTIR 2024&#xff09;将于2024年7月19-21日在中国杭州举行。FTIR 2024聚焦前沿技术与创新&#xff0c;将把机器人领域的创新学者和专家聚集到一个共同的论坛。会议的主要目标是促进机器人的研究和开发活动&#xff0c;另一个目…

使用单目相机前后帧特征点匹配进行3D深度估计的方法

在计算机视觉和机器人领域&#xff0c;三维空间感知是实现环境理解和交互的核心技术之一。特别是在资源受限的场合&#xff0c;使用针孔模型的单目相机进行深度估计成为了一种既经济又实用的解决方案。单目深度估计技术依赖于从连续视频帧中提取和匹配特征点&#xff0c;以估计…

企业大模型如何成为自己数据的“百科全书”?

作者 | 郭炜 编辑 | Debra Chen 在当今的商业环境中&#xff0c;大数据的管理和应用已经成为企业决策和运营的核心组成部分。然而&#xff0c;随着数据量的爆炸性增长&#xff0c;如何有效利用这些数据成为了一个普遍的挑战。 本文将探讨大数据架构、大模型的集成&#xff0…

线上网页点击菜单没有反应 报错ChunkLoadError:Loading chunk chunk-***** failed

现象 点击菜单无反应并且控制台报错Loading chunk chunk-***** failed 具体错误现象截图如下 分析 在线上页面已经打开的情况下&#xff0c;重新打包部署了前端项目。每次打包&#xff0c;js文件的hash值都会发生改变&#xff0c;因为我们的路由采用了懒加载&#xff0c;未…

吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.7

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周&#xff1a;优化算法 (Optimization algorithms)2.7 RMSprop 第二门课: 改善深层神经网络&am…

代码复现|Demucs Music Source Separation

一、背景介绍 Demucs是一个开源的音源分离项目。 Demucs在算法层面前后经历了三次大版本的进化&#xff0c;最原始的V1版本是&#xff1a;编解码LSTM。具体算法原理图如下所示。该版本在时域进行音源分离。关于阅读笔记请点击这篇文章。 V1版本原理图 V2版本是同时使用时域和频…

小白必看:新手学编程必会的100个代码

前言 我记得刚开始接触编程的时候&#xff0c;觉得太难了。 也很好奇&#xff0c;写代码的那些人也太厉害了吧&#xff1f;全是英文的&#xff0c;他们的英文水平一定很好吧&#xff1f; 他们是怎么记住这么多代码格式的&#xff1f;而且错了一个标点符号&#xff0c;整个程…