最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java雙重for循環(huán)的優(yōu)化示例

 更新時間:2025年06月09日 10:28:48   作者:香蕉炒肉  
在工作中,經(jīng)常性的會出現(xiàn)在兩張表中查找相同ID的數(shù)據(jù),許多開發(fā)者會使用兩層for循環(huán)嵌套,本文主要介紹了Java雙重for循環(huán)的優(yōu)化示例,感興趣的可以了解一下

在工作中,經(jīng)常性的會出現(xiàn)在兩張表中查找相同ID的數(shù)據(jù),許多開發(fā)者會使用兩層for循環(huán)嵌套,雖然實現(xiàn)功能沒有問題,但是效率極低,一下是一個簡單的優(yōu)化過程,代碼耗時湊從26856ms優(yōu)化到了748ms。

功能場景

有兩份List類型的數(shù)據(jù),分別是UestList(用戶表)和AccountList(賬戶表),要根據(jù)用戶的id從AccountList表中查找對應(yīng)的賬戶信息,并進(jìn)行后續(xù)的處理,示例如下:

存數(shù)據(jù)(偽代碼):5w條user數(shù)據(jù),3w條Account數(shù)據(jù) 

 @Data
    class User{
        private Long userId;
        private String name;
    }

    @Data
    class Account{
        private Long userId;
        private String content;
    }

    public class NestedLoopOptimization{

        public static List<User> getUserList(){
            List<User> users =new ArrayList<>();
            for(inti =1; i <=50000; i++) {
                User user =newUser();
                user.setName(UUID.randomUUID().toString());
                user.setUserId((long) i);
                users.add(user);
            }
            return users;
        }

        public static List<UserMemo> getAccountTestList(){
            List<Account> accountList =newArrayList<>();
            for(inti =30000; i >=1; i--) {
                Account account =new Account();
                account.setContent(UUID.randomUUID().toString());
                account.setUserId((long) i);
                accountList.add(account);
            }
            return accountList;
        }

        // ... 后續(xù)代碼

最直接的實現(xiàn)方式(未優(yōu)化的代碼):

public static void nestedLoop(List<User> usersList, List<UserMemo> accountList) {
    for (User user : usersList) {
        Long userId = user.getUserId();
        for (Account account : accountList) {
            if (userId.equals(account.getUserId())) {
                String content = account.getContent();
                // System.out.println("模擬數(shù)據(jù)content 業(yè)務(wù)處理......" + content); // 避免打印影響測試結(jié)果
            }
        }
    }
}

 耗時:約數(shù)萬毫秒,效率很低,數(shù)據(jù)量小的話無關(guān)緊要,如果隨著系統(tǒng)的迭代數(shù)據(jù)量驟增的時候,就會極其耗時。

第一步優(yōu)化:添加break 

每個userId在AccountList中只有一條對應(yīng)的數(shù)據(jù),所以找到匹配項之后就可以跳出內(nèi)循環(huán):

public static void nestedLoop(List<User> usersList, List<UserMemo> accountList) {
    for (User user : usersList) {
        Long userId = user.getUserId();
        for (Account account : accountList) {
            if (userId.equals(account.getUserId())) {
                String content = account.getContent();
                // System.out.println("模擬數(shù)據(jù)content 業(yè)務(wù)處理......" + content); // 避免打印影響測試結(jié)果
                break;
            }
        }
    }
}

第一步優(yōu)化結(jié)束之后任需要很多耗時,但是比起嵌套循環(huán)好很多。

第二步優(yōu)化:使用Map優(yōu)化 

public static void mapOptimizedLoop(List<User> userTestList, List<UserMemo> accountList) {
        Map<Long, String> contentMap = accountList.stream().collect(Collectors.toMap(UserMemo::getUserId, UserMemo::getContent));

        for (User user : userTestList) {
            Long userId = user.getUserId();
            String content = contentMap.get(userId);

            if (StringUtils.hasLength(content)) {
               // System.out.println("模擬數(shù)據(jù)content 業(yè)務(wù)處理......" + content); // 避免打印影響測試結(jié)果
            }
        }
    }

做以上優(yōu)化之后,耗時顯著減少,通常在數(shù)百毫秒級別。

原理:

兩層 for 循環(huán)嵌套的時間復(fù)雜度為 O(n*m),其中 n 和 m 分別為兩個列表的長度。使用 Map 后,get 操作的時間復(fù)雜度接近 O(1),整體時間復(fù)雜度降為 O(n+m),避免了內(nèi)循環(huán)的重復(fù)遍歷。HashMap 的 get 方法內(nèi)部使用了 getNode 方法來查找鍵值對。getNode 方法利用哈希表結(jié)構(gòu),快速定位到目標(biāo)鍵值對。雖然在極端情況下(所有鍵的哈希值都相同),getNode 的時間復(fù)雜度會退化為 O(n),但在實際應(yīng)用中,哈希沖突的概率很低,HashMap 的 get 操作效率通常很高。因此無需過于擔(dān)心 O(n) 的最壞情況。 

通過以上優(yōu)化之后,可以顯著的提高代碼的執(zhí)行效率,已經(jīng)其健壯性,尤其是在處理大數(shù)據(jù)量的時候,使用Map優(yōu)化,可以帶來巨大的性能提升,避免了不必要的計算,從而實現(xiàn)了代碼的性能。

到此這篇關(guān)于Java雙重for循環(huán)的優(yōu)化示例的文章就介紹到這了,更多相關(guān)Java雙重for循環(huán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java base64編碼、解碼的三種方式總結(jié)

    java base64編碼、解碼的三種方式總結(jié)

    這篇文章主要介紹了java base64編碼、解碼的三種方式,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-10-10
  • java通過itext生成pdf的干貨教程

    java通過itext生成pdf的干貨教程

    這篇文章主要介紹了java通過itext生成pdf的相關(guān)資料,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下
    2022-06-06
  • Intellij IDEA基于Springboot的遠(yuǎn)程調(diào)試(圖文)

    Intellij IDEA基于Springboot的遠(yuǎn)程調(diào)試(圖文)

    這篇文章主要介紹了Intellij IDEA基于Springboot的遠(yuǎn)程調(diào)試(圖文),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • JMETER用戶變量作用域測試流程

    JMETER用戶變量作用域測試流程

    這篇文章主要介紹了JMETER用戶變量作用域測試流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • 微信小程序微信登錄的實現(xiàn)方法詳解(JAVA后臺)

    微信小程序微信登錄的實現(xiàn)方法詳解(JAVA后臺)

    通常我們在登錄微信小程序的時候都是通過授權(quán)登錄,下面這篇文章主要給大家介紹了關(guān)于微信小程序微信登錄的實現(xiàn)方法,文中通過實例代碼介紹的介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Spring Boot配置AOP打印日志的全過程

    Spring Boot配置AOP打印日志的全過程

    這篇文章主要給大家介紹了關(guān)于Spring Boot配置AOP打印日志的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Java Cmd運行Jar出現(xiàn)亂碼的解決方案

    Java Cmd運行Jar出現(xiàn)亂碼的解決方案

    這篇文章主要介紹了Java Cmd運行Jar出現(xiàn)亂碼的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 詳解Springboot中的異步、定時、郵件任務(wù)

    詳解Springboot中的異步、定時、郵件任務(wù)

    這篇文章主要介紹了Springboot中的異步、定時、郵件任務(wù),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-11-11
  • 用Set類判斷Map里key是否存在的示例代碼

    用Set類判斷Map里key是否存在的示例代碼

    本篇文章主要是對用Set類判斷Map里key是否存在的示例代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • Java基于IDEA實現(xiàn)http編程的示例代碼

    Java基于IDEA實現(xiàn)http編程的示例代碼

    這篇文章主要介紹了Java基于IDEA實現(xiàn)http編程的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論

衡阳县| 汝城县| 洪泽县| 额济纳旗| 紫阳县| 屏南县| 湾仔区| 鸡泽县| 揭东县| 齐齐哈尔市| 中江县| 英吉沙县| 虎林市| 塔城市| 洪江市| 革吉县| 康平县| 封开县| 博客| 苏尼特右旗| 邳州市| 高青县| 合山市| 蓝田县| 会宁县| 朝阳市| 巴彦县| 郎溪县| 松滋市| 彝良县| 镇康县| 敦化市| 祁门县| 长阳| 民勤县| 永丰县| 双城市| 廉江市| 婺源县| 西贡区| 安图县|