使用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) 的 , 毕竟数据结构摆着,数组加链表。


相关推荐
桦说编程17 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅18 小时前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者19 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺19 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart21 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP1 天前
MyBatis-mybatis入门与增删改查
java
孟陬1 天前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌1 天前
一站式了解四种限流算法
java·后端·go
华仔啊1 天前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java