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.pswp.cn/web/43960.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43960.shtml
英文地址,請注明出處:http://en.pswp.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頁面 第三步下載安裝…

git patch怎么使用?

通常當我們提到 "patch" 時&#xff0c;我們可能指的是以下幾種情況&#xff1a; 1. **應用補丁文件**&#xff1a; 如果你有一個 .patch 文件&#xff0c;你可以使用 git apply 命令來應用它。 bash git apply your-patch-file.patch 這會將補丁文件中的更改應用到…

軟件架構之嵌入式系統設計

軟件架構之嵌入式系統設計 第 12 章&#xff1a;嵌入式系統設計12.1 嵌入式系統概論12.2 嵌入式系統的組成12.2.1 硬件架構12.2.2 軟件架構 12.3 嵌入式開發平臺與調試環境12.3.1 嵌入式系統軟件開發平臺12.3.2 嵌入式開發調試 第 12 章&#xff1a;嵌入式系統設計 隨著計算機…

力扣 1兩數之和

nums [2,7,6,3] target 9 需要在這個中找到 nums中數字下標&#xff0c;累加和等于target 也就是說既要數字下標&#xff0c;又要nums中數字&#xff0c;還要查找 因此&#xff0c;考慮map這種既有key 又有value的哈希表 問題是 map,unordered_map, muti_map用哪一個呢&a…

人工智能時代,零基礎學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…

Java:方法與類的奧秘——解鎖編程世界的鑰匙

探索編程的奧秘 在程序設計的廣闊海洋中&#xff0c;Java如同一艘穩健的航船&#xff0c;引領著無數開發者穿越代碼的波濤。本篇深度探索&#xff0c;將帶您潛入Java的內心深處&#xff0c;揭開“方法”與“類”的神秘面紗。這兩個概念&#xff0c;不僅是Java的基石&#xff0…

大模型日報 2024-07-11

大模型日報 2024-07-11 大模型資訊 CVPR世界第二僅次Nature&#xff01;谷歌2024學術指標出爐&#xff0c;NeurIPS、ICLR躋身前十 谷歌2024學術指標公布&#xff0c;CVPR位居第二&#xff0c;超越Science僅次于Nature。CVPR、NeurIPS、ICLR三大頂會躋身TOP 10。 CVPR成全球第二…

【簡歷】南京某大學頂級211碩士:拿offer可能性低

注&#xff1a;為保證用戶信息安全&#xff0c;姓名和學校等信息已經進行同層次變更&#xff0c;內容部分細節也進行了部分隱藏 簡歷說明 這份簡歷的背景是南京的一所頂級211的碩士,從學校背景來講呢,求職目標就是大廠的秋招&#xff0c;但是因為項目描述的亮點比較少&#x…

后仿真中《SDF反標必懂連載篇》之 反向提取SDF反標延遲

今天&#xff0c;整理一下最近工作中遇到的一個問題&#xff0c;及解決問題的辦法&#xff0c;僅分享給大家。 我們知道&#xff0c;我們在完成SDF時序反標之后&#xff0c;首先要做的事情&#xff1a;檢查sdfannotation 文件。文件中記錄了每個sdf 文件&#xff0c;每個實例的…

Fiddler使用詳解:網絡調試與分析工具(接口測試,斷點調試,弱網測試)

摘要 Fiddler是一個強大的網絡調試工具&#xff0c;它能夠記錄、檢查、修改和重發所有經過計算機的HTTP/HTTPS流量。本文將詳細介紹Fiddler的安裝、配置和使用技巧&#xff0c;幫助開發者和測試人員更好地理解網絡請求和響應。 1. Fiddler簡介 Fiddler是由Telerik公司開發的…

Python 四種字符串格式化方式

Python 四種字符串格式化方式 格式化&#xff08;formatting&#xff09;是指把數據填寫到預先定義的文本模板里面&#xff0c;形成一條用戶可讀的消息&#xff0c;并把這條消息保存成字符串的過程。 % 格式化 Python 里面最常用的字符串格式化方式是采用 % 格式化操作符。 …

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

有小伙伴問我能不能系統的聊下跨境電商的運作思路&#xff0c;因為過去的文章基本都是逐塊的在分享各種心得&#xff0c;對于一些想要系統學習跨境電商的朋友來說有點晦澀難懂&#xff0c;剛好趕上羊羊羊&#xff0c;索性花點時間來認真聊聊這個。 在開始聊這個話題之前&#…

探索數據的奧秘:sklearn中的聚類分析技術

探索數據的奧秘&#xff1a;sklearn中的聚類分析技術 在數據科學領域&#xff0c;聚類分析是一種無監督學習方法&#xff0c;它的目標是將數據集中的樣本劃分為多個組或“簇”&#xff0c;使得同一組內的樣本相似度高&#xff0c;而不同組間的樣本相似度低。scikit-learn&…

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…

社交媒體中智能品牌視覺識別系統的設計與應用

社交媒體中智能品牌視覺識別系統的設計與應用開題報告與任務書分析 一、引言 隨著社交媒體的蓬勃發展,品牌與消費者之間的互動日益頻繁,品牌視覺識別系統作為品牌傳播的重要載體,其設計與應用顯得尤為重要。特別是在智能技術的推動下,如何設計并應用智能品牌視覺識別系統…