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

news2024/9/9 7:27:45

在 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 {

    @Resource
    TestService testService;

    @RequestMapping("/helloword")
    @ResponseBody
    public String hello() {
        return "Hello Word";
    }


    @RequestMapping("/testinsert")
    @ResponseBody
    public String testinsert() {
        testService.testinsert();
        return "Hello Word";
    }

    @RequestMapping("/testfor")
    @ResponseBody
    public String testfor() {
        testService.testfor();
        return "Hello Word";
    }

    @RequestMapping("/testforeach")
    @ResponseBody
    public String testforeach() {
        testService.testforeach();
        return "Hello Word";
    }

    @RequestMapping("/testIterator")
    @ResponseBody
    public String testIterator() {
        testService.testIterator();
        return "Hello Word";
    }

    @RequestMapping("/testStream")
    @ResponseBody
    public String testStream() {
        testService.testStream();
        return "Hello Word";
    }

    @RequestMapping("/testparallelStream")
    @ResponseBody
    public 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 {

    @Resource
    TestMapper testMapper;

    @Override
    public 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));

    }

    @Override
    public 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");
    }

    @Override
    public 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");
    }

    @Override
    public 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");
    }

    @Override
    public 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");
    }

    /**
     * 用处就是将所有的偶数查询出来
     */
    @Override
    public 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: 31618
	at 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.coloradmin.cn/o/1918859.html

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

相关文章

软件测试面试题及答案,2024最强版

导读 精选400道软件测试面试真题&#xff0c;高清打印版打包带走&#xff0c;横扫软件测试面试高频问题&#xff0c;涵盖测试理论、Linux、MySQL、Web测试、接口测试、APP测试、Python、Selenium、性能测试、LordRunner、计算机网络、数据结构与算法、逻辑思维、人力资源等模块…

Nginx配置基础

ect/nginx/nginx.conf配置 1&#xff09;nginx 相关目录 工作目录&#xff1a;ect/nginx 家目录 执行文件&#xff1a;/usr/sbin/nginx 启动或重载 sudo /usr/sbin/nginx -t 检查配置文件 sudo /usr/sbin/nginx -s reload 重启服务 日志文件&#xff1a;/var/log/nginx 启动文…

除2! (题目来源:牛客)

题目来源&#xff1a;牛客网 给一个数组&#xff0c;一共有n个数。 你能进行最多k次操作。每次操作可以进行以下步骤&#xff1a; 选择数组中的一个偶数 a&#xff0c;将其变成a/2。 现在你进行不超过 k 次操作后&#xff0c;让数组中所有数之和尽可能小。请输出这个最小的和。…

虚幻引擎图文笔记:虚幻5(UE5.1.1)无法新建C++项目问题的解决

问题截图&#xff1a; Running E:/Unreal Engine/UE_5.1/Engine/Build/BatchFiles/Build.bat -projectfiles -project"E:/Unreal_Projects/UE5.1/TanChiShe/TanChiShe.uproject" -game -rocket -progress Running UnrealBuildTool: dotnet "..\..\Engine\Binar…

小巧低调的黑盒子,打造个性化音乐体验,欧尼士ONIX Alpha小尾巴上手

欧尼士ONIX的产品很有辨识度&#xff0c;这家来自英国的品牌&#xff0c;有着鲜明的黑金设计色彩&#xff0c;以及低调奢华的质感&#xff0c;当然最重要的是&#xff0c;欧尼士的音质表现非常出色&#xff0c;因此深受音乐爱好者的喜爱。在以手机等设备为载体的流媒体音乐盛行…

视频太大怎么压缩变小?这几种压缩方法值得收藏!

视频太大怎么压缩变小&#xff1f;在数字化浪潮汹涌的时代&#xff0c;处理大型视频文件已不再仅仅是存储空间的挑战&#xff0c;我们身处于数据洪流之中&#xff0c;数据的安全与隐私的保护已然成为了我们不得不面对的重大议题&#xff0c;特别是随着视频内容的井喷式增长及其…

【Java】零散知识--感觉每条都有知识在进入脑子唤起回忆

1&#xff0c;什么是双亲委派 AppClassLoader在加载类时&#xff0c;会向上委派&#xff0c;取查找缓存。 AppClassLoader >>ExtClassLoader >>BootStrapClassLoader 情况一 向上委派时查找到了&#xff0c;直接返回。 情况二 当委派到顶层之后&#xff0c;缓…

【cocos creator】2.x,伪3d拖拽,45度视角,60度视角,房屋装扮

伪3d拖拽,45度视角,60度视角 工程下载:(待审核) https://download.csdn.net/download/K86338236/89530812 dragItem2.t s import mapCreat2 from "./mapCreat2";const {ccclass, property } = cc._decorator; /*** 拖拽类,挂在要拖拽的节点上*/ @ccclass export…

04:定时器

定时器 1、定时器怎么定时2、怎样实现计数&#xff1f;2.1、控制寄存器TCON2.2、工作模式寄存器TCOM2.3、定时器T0 3、案例&#xff1a;通过定时器T0控制LED间隔1s亮灭 当定时器用的时候&#xff0c;靠内部震荡电路数数。当配置为定时器使用时&#xff0c;每经过1个机器周期&am…

【JavaEE】网络编程——UDP

&#x1f921;&#x1f921;&#x1f921;个人主页&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;JavaEE专栏&#x1f921;&#x1f921;&#x1f921; 文章目录 1.数据报套接字(UDP)1.1特点1.2编码1.2.1DatagramSocket1.2.2DatagramPacket…

数据结构复习计划之复杂度分析(时间、空间)

第二节&#xff1a;算法 时间复杂度和空间复杂度 算法(Algorithm)&#xff1a;是对特定问题求解方法(步骤)的一种描述&#xff0c;是指令的有限序列&#xff0c;其中每一条指令表示一个或多个操作。 算法可以有三种表示形式&#xff1a; 伪代码 自然语言 流程图 算法的五…

时间地点双限定|省公派教师喜提香港城市大学访问学者邀请函

X老师的研究方向为图像处理和机器学习&#xff0c;其根据专业特点及外语水平&#xff0c;将访学目标锁定在香港&#xff0c;并要求20天内获得邀请函以申报省公派。我们仅用了10天时间&#xff0c;就获得了香港城市大学的邀请函&#xff0c;且研究方向高度契合&#xff0c;完成了…

Hive的分区表分桶表

1.分区表&#xff1a; 是Hive中的一种表类型&#xff0c;通过将表中的数据划分为多个子集&#xff08;分区&#xff09;&#xff0c;每个分区对应表中的某个特定的列值&#xff0c;可以提高查询性能和管理数据的效率。分区表的每个分区存储在单独的目录中&#xff0c;分区的定义…

【正点原子i.MX93开发板试用连载体验】为什么模型不能运行在NPU上

本文最早发表于电子发烧友论坛&#xff1a;【新提醒】【正点原子i.MX93开发板试用连载体验】基于深度学习的语音本地控制 - 正点原子学习小组 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com) 昨天提到要使模型运行的NPU上&#xff0c;必须先将其量化。如果对没有量化…

构建未来对话:从零开始实现基于Vue 3的AI聊天页面

大家好&#xff0c;今天我们将一起探索如何从零开始&#xff0c;使用Vue 3构建一个AI对话页面。这个过程不仅会让我们了解Vue 3的新特性&#xff0c;还会让我们对构建交互式Web应用有一个全新的认识。如果你是编程新手&#xff0c;别担心&#xff0c;我会用通俗易懂的语言&…

汽车免拆诊断案例 | 2016款保时捷Macan车发动机故障灯异常点亮

故障现象  一辆2016款保时捷Macan车&#xff0c;搭载CYP发动机&#xff0c;累计行驶里程约为11.2万km。车主进厂反映&#xff0c;发动机故障灯异常点亮。 故障诊断  接车后试车&#xff0c;发动机怠速无明显异常&#xff0c;组合仪表上的发动机故障灯异常点亮。用故障检测仪…

数字信号处理及MATLAB仿真(4)——量化的其他概念

上回书说到AD转换的两个步骤——量化与采样两个步骤。现在更加深入的去了解以下对应的概念。学无止境&#xff0c;要不断地努力才有好的收获。万丈高楼平地起&#xff0c;唯有打好基础&#xff0c;才能踏实前行。 不说了&#xff0c;今天咱们继续说说这两个步骤&#xff0c;首先…

stm32学习笔记---MPU6050(理论部分)

目录 MPU6050简介 MPU6050参数 硬件电路 MPU6050框图 PS产品说明书和RM寄存器映像手册 PS产品说明书 RM寄存器映像 采样频率分频器 配置寄存器 陀螺仪配置寄存器 加速度计配置寄存器 数据寄存器 电源管理寄存器1 电源管理寄存器2 器件ID号 声明&#xff1a;本专…

css实现左右两端,并且对齐

<div class"card-header"><span>就诊人管理</span><el-button class"button" type"primary" >添加就诊人</el-button></div>.card-header {display: flex; //实现两端justify-content: space-between; //侧…

计算机基础 进制转化

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…