使用map优化双层for循环

文章目录


前言

比如我们现在拿到两个list 数据 ,一个是 User List 集合 ;另一个是 UserMemo List集合;

java 复制代码
@Data
public class User {
    private Long userId;
    private String name;
}
代码 UserMemo.java :
@Data
public class UserMemo {
    private Long userId;
    private String content;
}
java 复制代码
public static List<User> getUserTestList() {
        List<User> users = new ArrayList<>();
        for (int i = 1; i <= 50000; i++) {
            User user = new User();
            user.setName(UUID.randomUUID().toString());
            user.setUserId((long) i);
            users.add(user);
        }
        return users;
    }
    public static List<UserMemo> getUserMemoTestList() {
        List<UserMemo> userMemos = new ArrayList<>();
        for (int i = 30000; i >= 1; i--) {
            UserMemo userMemo = new UserMemo();
            userMemo.setContent(UUID.randomUUID().toString());
            userMemo.setUserId((long) i);
            userMemos.add(userMemo);
        }
        return userMemos;
    }

我们需要遍历 User List ,然后根据 userId 从 UserMemo List 里面取出 对应这个userId 的 content 值,做数据处理。

就是 for循环 里面还有 for循环, 然后做一些数据匹配、处理 这种场景。

java 复制代码
for (User user : userTestList) {
    Long userId = user.getUserId();
    for (UserMemo userMemo : userMemoTestList) {
        if (userId.equals(userMemo.getUserId())) {
            String content = userMemo.getContent();
            System.out.println("模拟数据content 业务处理......"+content);
        }
    }
}

注意:只考虑每个userId 在 UserMemo List 里面 都是只有一条数据的场景。


优化双层for循环

java 复制代码
public static void main(String[] args) {
        List<User> userTestList = getUserTestList();
        List<UserMemo> userMemoTestList = getUserMemoTestList();
        //直观的输出代码执行耗时,以及执行时间百分比
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        //关键步骤,将list转换为map
        Map<Long, String> contentMap =
                userMemoTestList.stream().filter(e->e.getUserId != null).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 业务处理......" + content);
            }
        }
        stopWatch.stop();
        System.out.println("最终耗时" + stopWatch.getTotalTimeMillis());
    }

map的取值效率 在多数的情况下是能维持接近 O(1) 的 , 毕竟数据结构摆着,数组加链表。


相关推荐
速易达网络13 分钟前
Three.js 动画入门教学:从场景搭建到流畅动效
开发语言·javascript·ecmascript
福大大架构师每日一题17 分钟前
excelize v2.11.1发布:Go 1.26.0起步,16项安全修复与嵌入对象能力全面升级
开发语言·安全·golang
Sarvartha19 分钟前
集合概述 & Collection 接口
开发语言
雪芽蓝域zzs21 分钟前
第 1 章:IDEA 创建 SpringBoot3.5.16 Maven 项目
java·maven·intellij-idea
golang学习记30 分钟前
IDEA 开始换芯,发布全新AI版终端
java·人工智能·intellij-idea
vipxieliang38 分钟前
ValidX 正则表达式预编译优化:Pattern 复用策略
java·spring boot·后端
lhbweilai44 分钟前
QT项目(串口助手)
开发语言·qt
eggwyw1 小时前
C++相交链表和反转链表详解
开发语言·c++
Wang's Blog1 小时前
Java 项目实战:交友项目 - FastDFS 工作原理
java·大数据·交友
Wang's Blog1 小时前
Java 项目实战:交友项目 - 保存访客记录
java·开发语言·交友