今天拿到這樣乙個需求:有map a和map b,這兩個map都持有著乙個同樣的key——id,其對應的value可能相同,也可能不相同。現在需要對兩個map中該key對應的value相同的鍵值對做些特殊的操作。
這是個很簡單的需求,**很簡單,我直接乙個迴圈裡巢狀另乙個迴圈去實現這個功能需求:
for(map.entryentry : mapa.entryset())
}
寫的時候也沒有考慮太多,提交**給組長review的時候,組長表示這裡的迴圈巢狀這樣寫不好,因為在實際業務中,集合b會比較大,假設mapa的size是10,mapb的size是1000,這樣寫就需要迴圈10*1000次,畢竟迴圈的時候需要進行一系列操作,假如有很多人同時通過ui來觸發這段邏輯,就可能存在效能上的問題,對於使用者來說,如果點選ui上的乙個按鈕需要等待個十來秒才有結果,那簡直是毀滅性的使用者體驗。
所以遇到這種需要巢狀迴圈的時候,應該儘量減少迴圈的次數;此外,一般情況下將大迴圈放到內部,將小迴圈放在外部,也會提高效能。
根據組長的建議,我可以將內部的大迴圈的迴圈次數盡量降低,原本是n*m的總迴圈次數,可以根據業務需求盡量拆分成n+m的總迴圈次數。當然,不太可能真的拆分成n+m,只是盡量往這個方向靠攏。
想要實現這個優化,就只能對內部的大迴圈進行分組。具體怎麼分組呢?可以new乙個新的map,然後按照id分組(這裡是因為我的業務需求中id會重複,所以將id作為分組依據)。將id相同的資料分成一組,然後存放到乙個arraylist中;然後這個id作為key存入map裡,而這個arraylist則作為value存入map裡。
假設原本內部大迴圈的集合size是1000,我們將其分成了10組,而外部小迴圈的集合size是10,那麼原本的101000總迴圈次數就可以變形成1000+1010次。如下:
for(map.entryentry : mapb.entryset())
for(map.entryentry : mapa.entryset())
}
當然了,這種優化思路是在特定的功能需求下才能實現的,具體問題具體分析,因為組長的提醒,我才知道原來巢狀迴圈還可以這樣來優化,**之道果然是要日積月累才行。
另外關於大迴圈在內小迴圈在外的寫法的具體分析,可以看看這篇文章:for迴圈巢狀的效率
可惜暫時我還看不懂。。
迴圈巢狀優化!!
第一部分說明 1 將大的迴圈放到內測,小的迴圈放到外側,確實能提高效率 全面測試巢狀多層for迴圈的效能。author 老紫竹的家 laozizhu.com public class testforloop system.out.println system.currenttimemillis t ...
迴圈巢狀的優化
基本for迴圈巢狀九九乘法表 public class test system.out.println 基本for迴圈列印100以內的質數 public class test if flag flag true 100以內的質數最優化 使用標籤 public class test system.ou...
oracle巢狀迴圈的執行計畫優化
巢狀迴圈連線處理的兩個資料集被稱為外部迴圈 outer loop,也就是驅動資料來源,driving row soulce 和內部迴圈 inner loop 外部迴圈為左子節點,內部迴圈為右子節點 如圖10 一6 所示,當外部迴圈執行一次的時候,內部迴圈需要針對外部迴圈返回的每條記錄執行一次。外部迴...