亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

功能場景

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

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

 @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("模擬數據content 業(yè)務處理......" + content); // 避免打印影響測試結果
            }
        }
    }
}

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

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

每個userId在AccountList中只有一條對應的數據,所以找到匹配項之后就可以跳出內循環(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("模擬數據content 業(yè)務處理......" + content); // 避免打印影響測試結果
                break;
            }
        }
    }
}

第一步優(yōu)化結束之后任需要很多耗時,但是比起嵌套循環(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("模擬數據content 業(yè)務處理......" + content); // 避免打印影響測試結果
            }
        }
    }

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

原理:

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

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

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

相關文章

  • Spring容器注入bean的五種方法逐個解析

    Spring容器注入bean的五種方法逐個解析

    依賴注入(Dependency Injection)和控制反轉(Inversion of Control)是同一個概念。具體含義是:當某個角色(可能是一個Java實例,調用者)需要另一個角色(另一個Java實例,被調用者)的協(xié)助時,在傳統(tǒng)的程序設計過程中,通常由調用者來創(chuàng)建被調用者的實例
    2023-02-02
  • 詳解Spring Boot實戰(zhàn)之Filter實現(xiàn)使用JWT進行接口認證

    詳解Spring Boot實戰(zhàn)之Filter實現(xiàn)使用JWT進行接口認證

    本篇文章主要介紹了詳解Spring Boot實戰(zhàn)之Filter實現(xiàn)使用JWT進行接口認證,具有一定的參考價值,有興趣的可以了解一下
    2017-07-07
  • java正則表達式獲取指定HTML標簽的指定屬性值且替換的方法

    java正則表達式獲取指定HTML標簽的指定屬性值且替換的方法

    下面小編就為大家?guī)硪黄猨ava正則表達式獲取指定HTML標簽的指定屬性值且替換的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • 基于socket和javaFX簡單文件傳輸工具

    基于socket和javaFX簡單文件傳輸工具

    這篇文章主要介紹了基于socket和javaFX簡單文件傳輸工具的相關資料,需要的朋友可以參考下
    2016-02-02
  • Java應用多機器部署解決大量定時任務問題

    Java應用多機器部署解決大量定時任務問題

    這篇文章主要介紹了Java應用多機器部署解決大量定時任務問題,兩臺服務器同時部署了同一套代碼, 代碼中寫有spring自帶的定時任務,但是每次執(zhí)行定時任務時只需要一臺機器去執(zhí)行,需要的朋友可以參考下
    2019-07-07
  • 關于java中@Async異步調用詳細解析附代碼

    關于java中@Async異步調用詳細解析附代碼

    本文主要介紹了java關于@Async異步調用詳細解析附代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • MyBatis Plus中代碼生成器使用詳解

    MyBatis Plus中代碼生成器使用詳解

    這篇文章主要介紹了MyBatis Plus中代碼生成器使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Spring Boot全局異常處理解析

    Spring Boot全局異常處理解析

    這篇文章主要為大家詳細介紹了Spring Boot全局異常處理的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • FastJson時間格式化問題避坑經驗分享

    FastJson時間格式化問題避坑經驗分享

    這篇文章主要為大家介紹了FastJson時間格式化問題避坑經驗分享,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • SpringBoot整合MyBatis超詳細教程

    SpringBoot整合MyBatis超詳細教程

    這篇文章主要介紹了SpringBoot整合MyBatis超詳細教程,下面從配置模式、注解模式、混合模式三個方面進行說明MyBatis與SpringBoot的整合,需要的朋友可以參考下
    2021-05-05

最新評論