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 {

    @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 快,但是数据量太大的情况下可能会收到了影响。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js vue table单元格合并

实现效果 关键代码 <table classtable table-bordered><thead><tr><th>检测项目</th><th>详细说明</th><th>检测结果</th><th>检测说明</th></tr></thead><tbody><tr ng-repeatrow in…

ant design pro多页签功能

效果&#xff1a; 原理&#xff1a; 1、所有需要页签页面&#xff0c;都需要一个共同父组件 2、如何缓存&#xff0c;用的是ant的Tabs组件&#xff0c;在共同父组件中&#xff0c;实际是展示的Tabs组件 3、右键&#xff0c;用的是ant的Dropdown组件&#xff0c;当点击时&…

基于红黑树对map和set的封装

前言 前面我们已经对红黑树做了介绍和实现&#xff0c;本期我们来对红黑树进一步改造&#xff0c;然后基于改造后的红黑树封装出map和set&#xff01; 本期内容介绍 • 红黑树的改造 • 红黑树的迭代器实现 • map的封装 • set的封装 • 全部源码 ● 红黑树的改造 我们目前…

【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;系统首页&#xff0c;个人中心&#xff0c;技师管理&#xff0c;技师信息管理&#xff0c;用户预约管理&#xff0c;取消预约管理&#xff0c;订单信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;技师信息&a…

接上一回C++:补继承漏洞+多态原理(带图详解)

引子&#xff1a;接上一回我们讲了继承的分类与六大默认函数&#xff0c;其实继承中的菱形继承是有一个大坑的&#xff0c;我们也要进入多态的学习了。 注意&#xff1a;我学会了&#xff0c;但是讲述上可能有一些不足&#xff0c;希望大家多多包涵 继承复习&#xff1a; 1&…

并查集+链表,CF 1131F - Asya And Kittens

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1131F - Asya And Kittens 二、解题报告 1、思路分析 本质是拼积木游戏 初始有n块积木&#xff0c;每次两块首尾拼成一块就行&#xff0c;拼接n - 1 次最后会得到一个大积木&#xff0c;我们从左往右输出组…

Nuxt3封装网络请求 useFetch $fetch

前言&#xff1a; 刚接触、搭建Nuxt3项目的过程还是有点懵的&#xff0c;有种摸石头过河的感觉&#xff0c;对于网络请求这块&#xff0c;与之前的Vue3项目有所区别&#xff0c;在Vue项目通常使用axios这个库进行网络请求&#xff0c;但在Nuxt项目并不推荐&#xff0c;因为有内…

【PostgreSQL】Spring boot + Mybatis-plus + PostgreSQL 处理json类型情况

Spring boot Mybatis-plus PostgreSQL 处理json类型情况 一、前言二、技术栈三、背景分析四、方案分析4.1 在PostgreSQL 数据库中直接存储 json 对象4.2 在PostgreSQL 数据库中存储 json 字符串 五、自定义类型处理器5.1 定义类型处理器5.2 使用自定义类型处理器 一、前言 在…

【PowerShell】-1-快速熟悉并使用PowerShell

目录 PowerShell是什么&#xff1f;和CMD的区别&#xff1f; PowerShell的演变 自动化IT管理任务 一些名词 详尽的PowerShell开始之路 1.打开PowerShell&#xff1a; 2.基本命令&#xff1a; &#xff08;1&#xff09;Get-Process &#xff08;2&#xff09;变量赋值…

React Hooks学习笔记

一、usestate的使用方法-初始化state函数 import React, { useState } from "react"; function App() {const [count, setCount] useState(0);return (<div><p>点击{count}次</p><button onClick{() > setCount(count 1)}>点击</bu…

【Linux系统】信号量(初次理解)

五个概念 多个执行流&#xff08;进程&#xff09;&#xff0c;能看到的一份资源&#xff1a;共享资源被保护起来的资源可以叫临界资源&#xff08;同步和互斥&#xff09; --- 用互斥的方式保护共享资源就叫临界资源互斥&#xff1a;任何时刻只能有一个进程在访问共享资源资源…

就业平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;企业管理&#xff0c;企业类型管理&#xff0c;留言板管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;招聘信息&#xff0c;简历&#xff0c;我的 …

SpringCloud--Eureka集群

Eureka注册中心集群 为什么要集群 如果只有一个注册中心服务器&#xff0c;会存在单点故障&#xff0c;不可以高并发处理所以要集群。 如何集群 准备三个EurekaServer 相互注册&#xff0c;也就是说每个EurekaServer都需要向所有的EureakServer注册&#xff0c;包括自己 &a…

游戏如何应对黑灰产工作室

游戏黑灰产工作室&#xff0c;是指以非法渠道、非法手段通过游戏进行牟利的团伙。使用脚本、外挂是黑灰产工作室的显著特征&#xff0c;其常见的牟利方式有&#xff1a;打金工作室、资源囤积号、初始号、自抽号、代练工作室以及营销欺诈等。 ▲ 常见的游戏黑灰产工作室牟利路径…

PMP证书 怎么报名?

首先&#xff0c;PMP证书相当于某些行业的敲门砖&#xff0c;身处项目管理相关行业的人应该清楚&#xff0c;这个证书&#xff0c;可能是你升职的不可或缺的一把钥匙。首先&#xff0c;我们先来了解一下什么是pmp。 1充分了解PMP PMP&#xff08;项目管理专业人士资格认证&am…

idm站点抓取可以用来做什么 idm站点抓取能抓取本地网页吗 idm站点抓取怎么用 网络下载加速器

在下载工具众多且竞争激烈的市场中&#xff0c;Internet Download Manager&#xff08;简称IDM&#xff09;作为一款专业的下载加速软件&#xff0c;仍然能够赢得众多用户的青睐&#xff0c;这都要得益于它的强大的下载功能。我们在开始使用IDM的时候总是有很多疑问&#xff0c…

「iOS」暑假第一周 —— ZARA的仿写

暑假第一周 ZARA的仿写 文章目录 暑假第一周 ZARA的仿写写在前面viewDidLoad 之中的优先级添加自定义字体下载想要的字体添加至info之中找到字体名字并应用 添加应用图标和启动页面 写在前面 暑假第一周留校学习&#xff0c;对于ZARA进行了仿写&#xff0c;在仿写的过程之中&a…

探索创意无限:独特的平面设计趋势与案例分享

随着平面设计领域的不断发展&#xff0c;平面设计趋势也在不断变化。在一个信息爆炸的时代&#xff0c;设计不仅仅是视觉的表达&#xff0c;更是思想和情感的交流。到了 2024 年&#xff0c;一些新的平面设计趋势已经开始显现&#xff0c;同时一些旧的趋势得到了新的发展和再度…

Jenkins安装部署与配置

目录 前言 Jenkins 的主要功能 Jenkins 的工作流程 一. 环境准备 二. 安装JDK 三. 安装Tomcat 四. 部署Jenkins 五. 浏览器访问 六. 修改超级管理员默认密码 七. 系统配置 八. 安装插件 九. 手动部署插件 前言 Jenkins 是一个开源的自动化服务器&#xff0c;用于…