java的遍历的方法对比 效率对比

在 Java 中,遍历对象的方式主要取决于对象的类型和数据结构。以下是几种常见的遍历方式,以及它们的效率比较:

  1. 普通的 for 循环

    • 效率:高。使用普通的 for 循环可以直接根据索引来访问元素,适用于数组和实现了 RandomAccess 接口的列表,例如 ArrayList
    • 适用对象: 数组、ArrayList 等支持随机访问的列表。
    ArrayList<String> list = new ArrayList<>();
    // 添加元素到 list 中
    for (int i = 0; i < list.size(); i++) {String element = list.get(i);// 处理元素
    }
    
  2. 增强型 for 循环(foreach 循环)

    • 效率:一般。增强型 for 循环适用于所有实现了 Iterable 接口的集合类,它会通过迭代器(iterator)遍历集合元素。
    • 适用对象: 所有实现了 Iterable 接口的集合类。
    ArrayList<String> list = new ArrayList<>();
    // 添加元素到 list 中
    for (String element : list) {// 处理元素
    }
    
  3. 迭代器(Iterator)

    • 效率:一般。使用 Iterator 显式地控制遍历过程,适合所有实现了 Iterable 接口的集合类。
    • 适用对象: 所有实现了 Iterable 接口的集合类。
    ArrayList<String> list = new ArrayList<>();
    // 添加元素到 list 中
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {String element = iterator.next();// 处理元素
    }
    
  4. Java 8 中的 Stream API

    • 效率:高(对于并行流,效率更高)。Stream API 提供了丰富的函数式操作,可以处理大量数据,并支持并行处理。
    • 适用对象: 所有实现了 Iterable 接口的集合类。
    ArrayList<String> list = new ArrayList<>();
    // 添加元素到 list 中
    list.stream().forEach(element -> {// 处理元素
    });
    
  5. Java 8 中的并行流

    • 效率:非常高。对于大数据集合,在多核处理器上并行处理能显著提高性能。
    • 适用对象: 所有实现了 Iterable 接口的集合类。
    ArrayList<String> list = new ArrayList<>();
    // 添加元素到 list 中
    list.parallelStream().forEach(element -> {// 处理元素
    });
    

综上所述,选择合适的遍历方式应该基于具体的数据结构和操作需求。对于小型数据集合,普通的 for 循环可能是最高效的选择;对于大数据集合或需要并行处理的情况,使用 Stream API 或并行流则更合适。
上述内容我是从ai里面查出来的,但是我头铁我不信,我要自己试试,然后我开始了尝试。

import com.test.testmq.service.TestService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.annotation.Resource;@Controller
public class TestController {@ResourceTestService testService;@RequestMapping("/helloword")@ResponseBodypublic String hello() {return "Hello Word";}@RequestMapping("/testinsert")@ResponseBodypublic String testinsert() {testService.testinsert();return "Hello Word";}@RequestMapping("/testfor")@ResponseBodypublic String testfor() {testService.testfor();return "Hello Word";}@RequestMapping("/testforeach")@ResponseBodypublic String testforeach() {testService.testforeach();return "Hello Word";}@RequestMapping("/testIterator")@ResponseBodypublic String testIterator() {testService.testIterator();return "Hello Word";}@RequestMapping("/testStream")@ResponseBodypublic String testStream() {testService.testStream();return "Hello Word";}@RequestMapping("/testparallelStream")@ResponseBodypublic String testparallelStream() {testService.testparallelStream();return "Hello Word";}}

这是对应的controller层

public interface TestService {public void testfor();public void testinsert();public void testforeach();public void testIterator();public void testStream();public void testparallelStream();}

这是service层

import com.test.testmq.entity.LeaderList;
import com.test.testmq.mapper.TestMapper;
import com.test.testmq.service.TestService;
import lombok.extern.log4j.Log4j;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;@Slf4j
@Service
public class TestServiceImpl implements TestService {@ResourceTestMapper testMapper;@Overridepublic void testinsert() {long start = System.currentTimeMillis();List<LeaderList> list = new ArrayList<>();for (int i = 0; i < 90000; i++) {LeaderList leaderList = new LeaderList();leaderList.setLeaderNo(i+"");leaderList.setLeaderName("张三");list.add(leaderList);}testMapper.insert(list);long end = System.currentTimeMillis();log.error(String.valueOf(end-start));}@Overridepublic void testforeach() {long start = System.currentTimeMillis();List<LeaderList> list = testMapper.list();List<LeaderList> listret = new ArrayList<>();for (LeaderList leaderList : list) {String leaderNo = leaderList.getLeaderNo();if((Integer.valueOf(leaderNo))%2 == 1){listret.add(leaderList);}}long end = System.currentTimeMillis();log.error(String.valueOf(end-start)+"end");log.error(listret.size()+"size");}@Overridepublic void testIterator() {long start = System.currentTimeMillis();List<LeaderList> list = testMapper.list();List<LeaderList> listret = new ArrayList<>();Iterator<LeaderList> iterator = list.iterator();while (iterator.hasNext()){LeaderList next = iterator.next();String leaderNo = next.getLeaderNo();if((Integer.valueOf(leaderNo))%2 == 1){listret.add(next);}}long end = System.currentTimeMillis();log.error(String.valueOf(end-start)+"end");log.error(listret.size()+"size");}@Overridepublic void testStream() {long start = System.currentTimeMillis();List<LeaderList> list = testMapper.list();List<LeaderList> listret = new ArrayList<>();list.stream().forEach(element -> {String leaderNo = element.getLeaderNo();if((Integer.valueOf(leaderNo))%2 == 1){listret.add(element);}// 处理元素});long end = System.currentTimeMillis();log.error(String.valueOf(end-start)+"end");log.error(listret.size()+"size");}@Overridepublic void testparallelStream() {long start = System.currentTimeMillis();List<LeaderList> list = testMapper.list();List<LeaderList> listret = new ArrayList<>();list.parallelStream().forEach(element -> {String leaderNo = element.getLeaderNo();if((Integer.valueOf(leaderNo))%2 == 1){listret.add(element);}// 处理元素});long end = System.currentTimeMillis();log.error(String.valueOf(end-start)+"end");log.error(listret.size()+"size");}/*** 用处就是将所有的偶数查询出来*/@Overridepublic void testfor() {long start = System.currentTimeMillis();List<LeaderList> list = testMapper.list();List<LeaderList> listret = new ArrayList<>();for (int i = 0; i < list.size(); i++) {LeaderList leaderList = list.get(i);String leaderNo = leaderList.getLeaderNo();if((Integer.valueOf(leaderNo))%2 == 1){listret.add(leaderList);}}long end = System.currentTimeMillis();log.error(String.valueOf(end-start)+"end");log.error(listret.size()+"size");}
}

大概就是一个插入的接口,还有就是几种的对比方法,分别是for,foreach,Iterator,Stream,parallelStream
然后插入的数据量大概是9730000
在这里插入图片描述
大概是千万不到,插入的时候我插入的是两个字段,实体应该是10多个字段,然后我就一遍一遍的执行看结果,我这边的出来的结果。
1,for 425615end
2,foreach 403837end
3,Iterator 363512end
4,Stream 331943end
5,parallelStream 直接报错了

 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1d45091]
19:31:51.865 ERROR ---  [http-nio-4399-exec-4] o.a.c.c.C.[.[localhost].[/].[dispatcherServlet]   :Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ArrayIndexOutOfBoundsException] with root cause
java.lang.ArrayIndexOutOfBoundsException: 31618at java.util.ArrayList.add(ArrayList.java:465)at com.test.testmq.service.impl.TestServiceImpl.lambda$testparallelStream$1(TestServiceImpl.java:100)at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384)at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)at java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:291)at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:731)at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1067)at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1703)at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:172)

虽然这个报错我我没去查,但是我认为,是数据量超过了parallelStream 底层的限制,盲猜底层应该是通过数组来控制,当然期间我在mysql也遇到了,批量插入的时候mysql提示我数据量太大了,然后我降到了90000条插入一次,因为mysql 的包有一个大小限制,报错信息没有粘出来,因为报错太明显了,不需要粘出来,基本上一看就懂了,根据我的推测大概是在不考虑位数的情况下,Stream 在数据量大的时候确实是最快的,其次就是Iterator ,其次就是foreach ,最后就是for ,但是尴尬的是,如果你需要找到第几个的情况下,还是需要for,因为他确实可以找到第几个,当然Stream 应该也可以吧,parallelStream 的效率我盲猜应该是比Stream 快,但是数据量太大的情况下可能会收到了影响。

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

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

相关文章

Ubuntu系统上安装Apache和WordPress

** 第一步跟新系统包 ** 首先跟新系统包 sudo apt update sudo apt upgrade第二步下载安装apache sudo apt install apache2 ##查看apache的状态是否启动成功 sudo systemctl status apache2 ##查看服务器的ip地址 sudo ip a通过ip地址进行访问apache页面 第三步下载安装…

软件架构之嵌入式系统设计

软件架构之嵌入式系统设计 第 12 章&#xff1a;嵌入式系统设计12.1 嵌入式系统概论12.2 嵌入式系统的组成12.2.1 硬件架构12.2.2 软件架构 12.3 嵌入式开发平台与调试环境12.3.1 嵌入式系统软件开发平台12.3.2 嵌入式开发调试 第 12 章&#xff1a;嵌入式系统设计 随着计算机…

人工智能时代,零基础学IT,我首推Python作为你编程入门语言!

人工智能时代为什么将 Python 称为第一语言&#xff1f; 因为python适应了人工智能时代&#xff1a; 人工智能时代对于代码的简便性有很大要求&#xff0c;像传统的C/CPP/Java学习较为复杂&#xff0c;学习路线长&#xff0c;对于很多零基础的人入门困难。python的兼容性&…

k8s集群部署mysql8主备

一、搜索mysql8版本 # helm search repo mysql# helm pull bitnami/mysql --version:11.1.2# tar -zxf mysql-11.1.2.tgz# cd mysql 二、修改value.ysqml文件 动态存储类自己提前搭建。 # helm install mysql8 -n mysql-cluster ./ -f values.yaml NAME: mysql8 LAST DEPLOYED…

【简历】南京某大学顶级211硕士:拿offer可能性低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这份简历的背景是南京的一所顶级211的硕士,从学校背景来讲呢,求职目标就是大厂的秋招&#xff0c;但是因为项目描述的亮点比较少&#x…

后仿真中《SDF反标必懂连载篇》之 反向提取SDF反标延迟

今天&#xff0c;整理一下最近工作中遇到的一个问题&#xff0c;及解决问题的办法&#xff0c;仅分享给大家。 我们知道&#xff0c;我们在完成SDF时序反标之后&#xff0c;首先要做的事情&#xff1a;检查sdfannotation 文件。文件中记录了每个sdf 文件&#xff0c;每个实例的…

4000字|手把手教你:从0到1搭建跨境电商生意

有小伙伴问我能不能系统的聊下跨境电商的运作思路&#xff0c;因为过去的文章基本都是逐块的在分享各种心得&#xff0c;对于一些想要系统学习跨境电商的朋友来说有点晦涩难懂&#xff0c;刚好赶上羊羊羊&#xff0c;索性花点时间来认真聊聊这个。 在开始聊这个话题之前&#…

qdma enable jtag debugger

ip上的m_axi_lite 是连接到qdma_v4_0_11_dma5_rtl_top这个ip的 和jtag debugger没有关系 qdma enable jtag debugger 读取的是ip内部reg ///home/nic626/smart_nic/build_dir/qdma_no_sriov_ex/qdma_no_sriov_ex.srcs/sources_1/ip/qdma_no_sriov.xcix!/qdma_no_sriov/ip_0/so…

SQL基础-DQL 小结

SQL基础-DQL 小结 学习目标&#xff1a;学习内容&#xff1a;SELECTFROMWHEREGROUP BYHAVINGORDER BY运算符ASC 和 DESC 总结 学习目标&#xff1a; 1.理解DQL&#xff08;Data Query Language&#xff09;的基本概念和作用。 2.掌握SQL查询的基本语法结构&#xff0c;包括SEL…

Linux文件编程(标准C库)

目录 一、标准C库打开/创建文件&#xff0c;读写文件&#xff0c;光标移动 二、标准C库写入结构体到文件 三、其他函数补充 1.fputc函数 2.feof函数和fgetc函数 前面讲到的open函数都是基于linux内核的&#xff0c;也就是说在Windows系统上无法运行&#xff0c;移植性比较…

使用simulink进行esp32开发,进行串口收发数据需要注意的地方,为什么收发不成功

1&#xff0c;主要是因为simulink里的配置文件配置的波特率和串口接受软件配置的波特不一致导致的 2&#xff0c;主要有以下三个界面 a.配置文件 b.模型 模型直接选择使用的是那组串口就行了&#xff0c;一般情况下我们收发使用同一组就可以&#xff0c;这样收发模块填写的端…

20240711编译友善之臂的NanoPC-T6开发板的Buildroot

20240711编译友善之臂的NanoPC-T6开发板的Buildroot 2024/7/11 21:02 百度&#xff1a;nanopc t6 wiki https://wiki.friendlyelec.com/wiki/index.php/NanoPC-T6/zh NanoPC-T6/zh 4.4 安装系统 4.4.1 下载固件 4.4.1.1 官方固件 访问此处的下载地址下载固件文件 (位于网盘的&q…

【Python】已解决:ModuleNotFoundError: No module named ‘sklearn.cross_validation

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 &#xff08;机器学习分割数据问题&#xff09;解决“ModuleNotFoundError: No module named ‘sklearn.cross_validation’” 一、问题背景 在机器学习的实践中&#xff0c;数据分割是…

CSS技巧专栏:一日一例 4.纯CSS实现两款流光溢彩的酷炫按钮特效

大家好&#xff0c;今天是 CSS技巧专栏&#xff1a;一日一例 第三篇《纯CSS实现两款流光溢彩的酷炫按钮特效》 先看图&#xff1a; 特此说明&#xff1a; 本专题专注于讲解如何使用CSS制作按钮特效。前置的准备工作和按钮的基本样式&#xff0c;都在本专栏第一篇文章中又详细…

Python基础教学之四:面向对象编程——迈向更高级编程

Python基础教学之四&#xff1a;面向对象编程——迈向更高级编程 一、面向对象编程概念 1. 类和对象 定义&#xff1a;在面向对象编程(OOP)中&#xff0c;类是创建对象的模板&#xff0c;它定义了对象的属性和方法。对象是类的实例&#xff0c;具体存在的实体&#xff0c;拥有…

【JavaScript 报错】未捕获的范围错误:Uncaught RangeError

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、错误原因分析1. 递归调用次数过多2. 数组长度超出限制3. 数值超出允许范围 二、解决方案1. 限制递归深度2. 控制数组长度3. 检查数值范围 三、实例讲解四、总结 Uncaught RangeError 是JavaScript中常见的一种错误&…

347. 前 K 个高频元素(中等)

347. 前 K 个高频元素 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;347. 前 K 个高频元素 2.详细题解 寻找出现频率前 k k k高的元素&#xff0c;因此需要先统计各个元素出现的次数&#xff0c;该步骤时间复杂度为 O ( n ) O(n) O(n)…

C++模板总结

文章目录 写在前面1. 函数模板1.1 函数模板的概念1.2 函数模板的原理1.3 函数模板的实例化1.4 函数模板的实例化模板参数的匹配原则 2. 类模板3. 非类型模板参数4. 模板的特化4.1 概念4.2 函数模板特化4.3 类模板特化 5. 模板分离编译6. 总结 写在前面 进入C以后&#xff0c;C…

智能小车——初步想法

需要参考轮趣的智能小车自己搭建一台智能机器人&#xff0c;这里从底层控制开始逐步搭建。 控制模式 之后要自行搭建智能小车&#xff0c;所以将轮趣的底盘代码进行学习&#xff0c;根据开发手册先大致过一遍需要的内容。 有做很多个控制方法&#xff0c;包括了手柄、串口、…

Linux下常见压缩文件tar.xz、tar.bz2、tar.gz的区别和详解

文章目录 tar.xz tar.bz2 tar.gz 的区别三种文件的解压方式tar.xz的解压三种压缩文件的创建方式 tar.xz tar.bz2 tar.gz 的区别 这三个文件扩展名都表示压缩后的档案文件&#xff0c;但它们使用不同的压缩算法。 tar.xz: tar 代表 Tape Archive&#xff0c;它是一种将多个文件…