Java循环对比:传统for循环、增强型for循环和forEach循环

1、传统for循环

传统的for循环是一种经典的循环结构,在Java中广泛使用。

以下是传统for循环的特点:

灵活控制:传统for循环使用形式为for (初始化表达式; 终止条件; 步进表达式)的语法,可以手动控制循环的索引,并根据需要执行自定义操作。

索引访问:传统for循环通过索引访问集合或数组中的元素,可以直接读取和修改元素的值。

例如:

import java.util.Arrays;
import java.util.List;public class Demo {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);for (int i = 0; i < numbers.size(); i++) {System.out.println(numbers.get(i));  // 读取元素的属性值或执行操作是允许的numbers.set(i, 10);  // 直接修改元素的值是允许的}}
}

底层操作:相比增强型for循环,传统for循环提供了更底层的操作,更加灵活,但也更加繁琐。

适用对象:适用于任何实现了Iterable或Iterator接口的集合类。

示例代码:

public class Demo {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5};for (int i = 0; i < numbers.length; i++) {System.out.println(numbers[i]);}}
}

传统for循环代码结构是这样的:

for(循环变量的初始声明;循环的判定条件;改变循环变量的条件){

循环体

}

其中执行顺序是:①循环变量的初始声明(声明循环变量) ②循环的判断条件(判定是否继续执行循环,是boolean值) ③循环体(想要重复执行的代码段) ④改变循环变量的条件(用于结束循环) ⑤再回到2中判断是否跳出循环,如果判断结果是true,继续上述过程。如果判断结果是false,则跳出整个循环代码段,执行后续代码。

如测试通过遍历方式,实现为数组赋值,赋值为100,200,300,400,500

import java.util.Arrays;public class Demo {public static void main(String[] args) {int[] arr = new int[5];int num = 100;for (int i = 0; i < arr.length; i++) {arr[i] = num;num += 100;}System.out.println(Arrays.toString(arr));}
}

代码的输出结果是这样的:[100, 200, 300, 400, 500]

显而易见,普通for循环通过下标索引,将值赋值到了数组内部。

2、增强型for循环

增强型for循环,也称为foreach循环,是一种简化版的循环语法。它可以用于遍历数组或实现了Iterable接口的集合类。

以下是增强型for循环的特点:

语法简洁:增强型for循环使用形式为for (元素类型 元素变量 : 集合或数组)的语法,使代码更易读和编写。

只读访问:在每次迭代中,增强型for循环提供对当前元素的只读访问权限,不能直接修改元素的值。

例如:

import java.util.ArrayList;
import java.util.List;public class Demo {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("Hello");list.add("World");System.out.println(list);for (String s : list) {s = "New Value";  // 尝试修改元素的值}System.out.println(list);}
}

 

适用对象:适用于数组或实现了Iterable接口的集合类。

示例代码:

import java.util.Arrays;
import java.util.List;public class Demo {public static void main(String[] args) {List<String> list = Arrays.asList("Apple", "Banana", "Orange");for (String fruit : list) {System.out.println(fruit);}}
}

 

增强型for循环代码结构是这样的:

for(接收数组元素的类型 变量名:数组){

变量名代表数组中的每一个数据

}

增强for可以遍历数组中的每一个元素,用前面的变量名来接收。我强调一下是接收,因为类型所定义的变量只是用来接收数组中各个元素,而不是将每个元素分离出来。

列如上面问题,测试通过2种遍历方式,分别实现为数组赋值,赋值为100,200,300,400,500

import java.util.Arrays;public class Demo {public static void main(String[] args) {int[] arr = new int[5];int num = 100;for (int i : arr) {i = num;num += 100;}System.out.println(Arrays.toString(arr));}
}

代码输出结果是这样的:[0, 0, 0, 0, 0]

也就是说增强for循环根本没有将值传到数组内部。这也是普通for与增强for的区别,普通for循环可以实现为数组赋值,根据索引操作;foreach只能遍历获取,不能修改数组中的数据。

除此之外,:前面是接收数组元素的类型,这里强调的是,这里定义的类型是接受数组元素的类型,不必是数组的类型关系。

for(long|float|double|.. i:arr){i=num;num+=100;
}

其实类型没有那么严格,只要是能接收这个int型的数组arr的元素即可。当然不能接收的其他类型,比如byte,short ,char…就会报错。

 

3forEach循环

forEach是Java 8中引入的一个方法,用于遍历集合中的元素并对其执行某种操作。它可以接受一个函数作为参数,这个函数会对集合中的每个元素进行操作。这个函数可以是Lambda表达式,也可以是一个普通的函数接口。

Lambda表达式在Java 8中被引入,是一种简洁,函数式的方法来编写某些操作。Lambda表达式主要被用于创建只有一个方法的接口,这个接口可以包含一个参数列表和一个表达式或一个块语句。这种表达式或块语句就是Lambda体。

以下是Lambda表达式for循环的特点:

函数式风格:Lambda表达式for循环采用函数式编程风格,通过Lambda表达式定义循环体的操作,使代码更加简洁和易读。

自动迭代:与增强型for循环类似,Lambda表达式for循环自动迭代集合或数组中的元素,无需手动控制索引。

例如:

import java.util.Arrays;
import java.util.List;public class Demo {public static void main(String[] args) {List<String> list = Arrays.asList("Apple", "Banana", "Cherry");// 使用Java 8的forEach和Lambda表达式list.forEach(fruit -> System.out.println(fruit));}
}

4、效率简单对比

说明:测试可能有不严谨的地方,时间,机器,执行顺序,cpu运行后效率降低也有可能,仅供参考

import java.util.ArrayList;
import java.util.List;public class Demo {public static void main(String[] args) {long[] numbers = {10000L, 100000L, 1000000L, 10000000L};for (int j= 0; j < numbers.length; j++) {long times = numbers[j];System.out.println("操作次数:" + times);List<String> list = new ArrayList<>();List<String> list1 = new ArrayList<>();List<String> list2 = new ArrayList<>();List<String> list3 = new ArrayList<>();for (int i = 0; i < times; i++) {list.add(new String());}long startTime = System.currentTimeMillis();//普通forfor (int i = 0; i < list.size(); i++) {list1.add(list.get(i));}long endTime = System.currentTimeMillis();System.out.println("普通for时间(毫秒):" + (endTime - startTime));//增强forlong startTime1 = System.currentTimeMillis();for (String s : list) {list2.add(s);}long endTime1 = System.currentTimeMillis();System.out.println("增强for时间(毫秒):" + (endTime1 - startTime1));long startTime2 = System.currentTimeMillis();//forEachlist.forEach(s -> list3.add(s));long endTime2 = System.currentTimeMillis();System.out.println("forEach时间(毫秒):" + (endTime2 - startTime2));}}
}

执行结果:

操作次数:10000

普通for时间(毫秒):1

增强for时间(毫秒):1

forEach时间(毫秒):59

操作次数:100000

普通for时间(毫秒):2

增强for时间(毫秒):2

forEach时间(毫秒):3

操作次数:1000000

普通for时间(毫秒):37

增强for时间(毫秒):10

forEach时间(毫秒):8

操作次数:10000000

普通for时间(毫秒):203

增强for时间(毫秒):170

forEach时间(毫秒):184

5、适用场景的选择

选择合适的循环方式取决于具体的需求和操作。以下是一些建议的使用场景:

传统for循环:适用于需要手动控制索引、执行自定义操作或修改集合或数组元素值的场景。

增强型for循环:适用于简单的遍历和只读操作,不需要修改集合或数组的元素。

Lambda表达式+forEach循环:适用于函数式编程风格,简化代码,并且无需手动控制索引的场景。

根据具体的需求,我们可以灵活选择不同的循环方式,以实现代码的简洁、可读性和性能的平衡。

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

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

相关文章

C语言数组和指针笔试题(三)(一定要看)

目录 字符数组四例题1例题2例题3例题4例题5例题6例题7 结果字符数组五例题1例题2例题3例题4例题5例题6例题7结果字符数组六例题1例题2例题3例题4例题5例题6例题7 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412;个…

【数值计算方法】非线性方程(组)和最优化问题的计算方法:非线性方程式求根的二分法、迭代法、Newton 迭代法及其Python实现

目录 一、非线性方程式求根 1、二分法&#xff08;Bisection Method、对分法&#xff09; a. 理论简介 b. python实现 2、迭代法&#xff08;Iterative Method&#xff09; a. 理论简介 b. python实现 3、Newton 迭代法&#xff08;Newtons Method&#xff09; a. 理论…

电脑入门:电脑不认新硬盘时该怎么办?

电脑不认新硬盘时该怎么办? 当新硬盘加进后,正常工作时,没有什么问题。若电脑遇到特殊情况时,电脑对新硬盘“不认”,可采取以下措施让电脑重新“认”新硬盘,显示新分区(如G、H、I、J)。 咱的目的是保持S-ATA的开启,把控制板载S-ATA设定值由No变成Yes就可以。 首…

【数据结构与算法】链表的实现以及一些基本算法

目录 单选链表的基本实现 有序列表的合并&#xff08;双指针法&#xff09; 链表的反转 链表实现两数之和 判定链表是否有环 单选链表的基本实现 public class LinkedList1 {//头节点Node first;//尾节点Node last;//大小int size 0;//头插法public void addFirst(int…

微信小程序学习笔记3.0

第3章 资讯类:仿今日头条微信小程序 3.1 需求描述及交互分析 需求描述 仿今日头条微信小程序,要具有以下功能。 (1)首页新闻频道框架设计,包括底部标签导航设计、新闻检索框设计及新闻频道滑动效果设计。 (2)首页新闻内容设计,包括新闻标题、新闻图片及新闻评论设计…

springcloudgateway 默认转发不生效

配置文件配置了自动转发 spring.cloud.gateway.discovery.locator.enabled true 但是用微服务路径访问时一直报503 [fa9cc893-1] There was an unexpected error (typeService Unavailable, status503). 这个503看得我是一头雾水。原因在于这个默认错误页的报错显示不全…

TikTok的媒体革命:新闻业如何适应短视频时代?

在数字时代&#xff0c;媒体行业一直在不断演变和创新&#xff0c;以适应观众的变化需求和技术的发展。而在这个进化的过程中&#xff0c;短视频应用TikTok已经崭露头角&#xff0c;成为了一个重要的信息传播平台。 这篇文章将深入探讨TikTok如何引领了媒体的一场革命&#xf…

转载-C#学习笔记-基本概念(CLR、CTS、CLS...)

1. CLR(Common Language Runtime&#xff0c;公共语言运行时(库)) 可由多种.NET语言使用的运行时环境&#xff0c;其主要作用是定位、加载和管理.NET类型、内存管理、安全检查、线程管理等。.NET运行库提供了一个定义明确的运行库层&#xff0c;可以被支持.NET的所有语言和平台…

2、Linux中静态IP与动态IP的修改

修改为静态IP 打开文件 sudo vim /etc/network/interfaces修改如下 # interfaces(5) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopbackauto ens33#配置网络为DHCP模式 #iface ens33 inet dhcp#配置网络 ens33为静态IP模式 iface ens33 inet static #设置…

基于Vue+ELement搭建动态树与数据表格实现分页

基于VueELement搭建动态树与数据表格实现分页 一、前言二、左侧动态树实现2.1.后台数据接口定义2.2.前端导航菜单绑定2.3.根据数据渲染页面 3.分页 一、前言 在上一篇博文我们搭建了首页导航和左侧菜单&#xff0c;但是我们的左侧菜单是死数据今天我们就来把死的变成活的&#…

自学WEB后端01-安装Express+Node.js框架完成Hello World!

一、前言&#xff0c;网站开发扫盲知识 1.网站搭建开发包括什么&#xff1f; 前端 前端开发主要涉及用户界面&#xff08;UI&#xff09;和用户体验&#xff08;UX&#xff09;&#xff0c;负责实现网站的外观和交互逻辑。前端开发使用HTML、CSS和JavaScript等技术来构建网页…

jquery相关操作--但是高级有些不太明白

jquery介绍 jQuery是目前使用最广泛的javascript函数库。据统计&#xff0c;全世界排名前100万的网站&#xff0c;有46%使用jQuery&#xff0c;远远超过其他库。微软公司甚至把jQuery作为他们的官方库。 jQuery的版本分为1.x系列和2.x、3.x系列&#xff0c;1.x系列兼容低版本…

Leetcode 386. 字典序排数

文章目录 题目代码&#xff08;9.22 首刷看解析&#xff09; 题目 Leetcode 386. 字典序排数 代码&#xff08;9.22 首刷看解析&#xff09; 迭代DFS class Solution { public:vector<int> lexicalOrder(int n) {vector<int> ret(n);int number 1;for(int i 0…

目标检测YOLO实战应用案例100讲-面向路边停车场景的目标检测(中)

目录 3.1.1 特征图相似度计算 3.1.2 特征图相似度实验 3.1.3 基于GhostBlock的网络结构改进

SVN -基础

SVN - 基础 概念操作步骤开发实际经验 概念 带SVN路径 有隐藏文件&#xff0c;记录repo的一些信息&#xff0c;与repo进行关联&#xff0c;可以与repo进行同步 不带SVN路径 只是单纯的文件&#xff0c;与repo独立 操作步骤 checkout 具有路径 URLcheckout dir 输出目标文件夹…

Flink--6、输出算子(连接到外部系统、文件、kafka、MySQL、自定义Sink)

星光下的赶路人star的个人主页 世间真正温煦的春色&#xff0c;都熨帖着大地&#xff0c;潜伏在深谷 文章目录 1、输出算子&#xff08;Sink&#xff09;1.1 连接到外部系统1.2 输出到文件1.3 输出到Kafka1.4 输出到MySQL&#xff08;JDBC&#xff09;1.4 自定义Sink输出 1、输…

【数学建模】2023华为杯研究生数学建模F题思路详解

强对流降水临近预报 我国地域辽阔&#xff0c;自然条件复杂&#xff0c;因此灾害性天气种类繁多&#xff0c;地区差异大。其中&#xff0c;雷雨大风、冰雹、龙卷、短时强降水等强对流天气是造成经济损失、危害生命安全最严重的一类灾害性天气[1]。以2022年为例&#xff0c;我国…

我的python安装在哪儿了?python安装路径怎么查?

对于 Python 开发者来说&#xff0c;Windows 系统中的 Python 安装路径是非常重要的。在本文中&#xff0c;我们将从多个方面探究如何查看 Python 安装路径&#xff0c;并提供代码示例。 一、使用文件浏览器查看 Python 安装路径 在 Windows 系统中&#xff0c;我们可以使用文…

vue_Delete `␍`eslint(prettier/prettier)

Delete ␍eslint(prettier/prettier) 错误的解决方案 问题背景 在Windows笔记本上新拉完代码&#xff0c;在执行pre-commit时&#xff0c;出现如下错误&#xff1a; Delete ␍eslint(prettier/prettier)问题根源 罪魁祸首是git的一个配置属性&#xff1a;core.autocrlf 由于…

MATLAB实战 | 粮食储仓的通风控制问题

粮食储仓的通风控制问题 01、应用实战 【例1】粮食储仓的通风控制问题。在粮食储备中&#xff0c;合适的湿度是保证粮食质量的前提。一般来说&#xff0c;若粮食水分的吸收和蒸发量相等&#xff0c;这个湿度称为平衡点湿度。只有实际湿度处于平衡点湿度以下&#xff0c;粮食质…