java避免多層嵌套循環(huán)用到的一些小技巧分享
避免多層嵌套循環(huán)用到的小技巧
在JAVA開發(fā)中,我們經(jīng)常遇到一些寫二重循環(huán)甚至更多循環(huán)的情況,但是,這種循環(huán)會造成很多資源浪費(fèi)。
因?yàn)閄次循環(huán)下套用Y次循環(huán),相當(dāng)于總共執(zhí)行了X * Y次運(yùn)算,因此,我們應(yīng)盡量避免多重嵌套的情況。
例:
(1)借用第三個List,使用Contains()方法
情景:從ListA 中取出userId與ListB中的userId做對比,當(dāng)其相等時,取出ListB中該條數(shù)據(jù)。
public List getDetail(List<AttendanceInfo > ?listA, List<CardInfo > listB) { ?? ? ? ?List list= new ArrayList<>(); ?? ? ? ?List listC = new ArrayList(); ?? ? ? ?for(AttendanceInfo attendanceInfo: attendanceList){ ? ? ? ? ? ? listC.add(attendanceInfo.getUserId()); ? ? ? ? } ? ? ? ? for (CardInfo cardInfo: cardList){ ? ? ? ? ? ? if (! listC.contains(cardInfo.getUserId())){ ? ? ? ? ? ? ? ? list.add(cardInfo); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? return list; ? ? }
我們可以先創(chuàng)建一個空的ListC, 遍歷 ListA取出userId添加到ListC中,之后,遍歷ListB并通過contains()方法將符合數(shù)據(jù)添加到list當(dāng)中。
(2)數(shù)據(jù)量大,使用HashSet
雖然 contains()方法可以進(jìn)行判斷,但是當(dāng)數(shù)據(jù)量極大時,我們借用的第三個List就不要使用ArrayList了,最好使用HashSet,這跟他們的底層數(shù)據(jù)結(jié)構(gòu)有關(guān)系。
舉個直觀的例子,循環(huán)的時候,同樣是20W條數(shù)據(jù),ArrayList的contains()方法跑了2分鐘,HashSet的contains()方法跑了 1秒?。。?!
(3)JAVA8及以上使用lambda表達(dá)式
Java8引進(jìn)了lambda表達(dá)式和流模式,比如map.reduce,詳情可百度學(xué)習(xí)下lambda寫法。
跳出java中的多層嵌套循環(huán)
使用 break 標(biāo)號語句跳出嵌套循環(huán):
public static void main(String[] args) { javastack: for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { System.out.println("i="+i+"?j="+j); if (j == 3) { break javastack; } } } }
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
優(yōu)化SpringBoot程序啟動速度的實(shí)現(xiàn)
本文主要介紹了優(yōu)化SpringBoot程序啟動速度的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Spring context:component-scan的使用及說明
這篇文章主要介紹了Spring context:component-scan的使用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09手?jǐn)]一個Spring?Boot?Starter并上傳到Maven中央倉庫
本文主要介紹了手?jǐn)]一個Spring?Boot?Starter并上傳到Maven中央倉庫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05MyBatis Plus之實(shí)現(xiàn)動態(tài)排序方式
這篇文章主要介紹了MyBatis Plus之實(shí)現(xiàn)動態(tài)排序方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02減小Maven項(xiàng)目生成的JAR包體積實(shí)現(xiàn)提升運(yùn)維效率
在Maven構(gòu)建Java項(xiàng)目過程中,減小JAR包體積可通過排除不必要的依賴和使依賴jar包獨(dú)立于應(yīng)用jar包來實(shí)現(xiàn),在pom.xml文件中使用<exclusions>標(biāo)簽排除不需要的依賴,有助于顯著降低JAR包大小,此外,將依賴打包到應(yīng)用外,可減少應(yīng)用包的體積2024-10-10SpringBoot構(gòu)造器注入循環(huán)依賴及解決方案
這篇文章主要介紹了SpringBoot構(gòu)造器注入循環(huán)依賴及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03springcloud中RabbitMQ死信隊(duì)列與延遲交換機(jī)實(shí)現(xiàn)方法
死信隊(duì)列是消息隊(duì)列中非常重要的概念,同時我們需要業(yè)務(wù)場景中都需要延遲發(fā)送的概念,比如12306中的30分鐘后未支付訂單取消,那么本期,我們就來講解死信隊(duì)列,以及如何通過延遲交換機(jī)來實(shí)現(xiàn)延遲發(fā)送的需求,感興趣的朋友一起看看吧2022-05-05Java隊(duì)列篇之實(shí)現(xiàn)數(shù)組模擬隊(duì)列及可復(fù)用環(huán)形隊(duì)列詳解
像棧一樣,隊(duì)列(queue)也是一種線性表,它的特性是先進(jìn)先出,插入在一端,刪除在另一端。就像排隊(duì)一樣,剛來的人入隊(duì)(push)要排在隊(duì)尾(rear),每次出隊(duì)(pop)的都是隊(duì)首(front)的人2021-10-10