掌握这个优化双循环的技巧效率猛增百分之80
在微服务中的项目中,经常会遇到这种的业务:要查询两个表中公共的数据,比如一个表是查询用户信息,其中包含部门编号,另一个表是查询部门信息。这两个表是在两个服务中,而现在要得到每个用户所在的部门名称,通常实现的方式是进行双循环来查询数据 这里举个示例:
用户
@Data
public class TestUser {
private long id;
private String name;
private long deptId;
}
用户集合为10万
public static List<TestUser> getTestUserList(){
List<TestUser> testUsers = new ArrayList<>(100000);
for (long i = 0; i < 100000; i++) {
TestUser testUser = new TestUser();
testUser.setId(i);
testUser.setName("用户-" + i);
testUser.setDeptId(i);
testUsers.add(testUser);
}
return testUsers;
}
部门
@Data
public class TestDept {
private long id;
private String name;
}
部门集合为5万
public static List<TestDept> getTestDeptList(){
List<TestDept> testDepts = new ArrayList<>(50000);
for (long i = 0; i < 50000; i++) {
TestDept testDept = new TestDept();
testDept.setId(i);
testDept.setName("部门-" + i);
testDepts.add(testDept);
}
return testDepts;
}
常规的双循环来查询
这里使用最常见的方法,使用双循环来匹配数据,第一层循环为用户集合,然后每次循环用户集合中的元素时,再循环部门集合
public static void run1(){
List<TestUser> testUserList = getTestUserList();
List<TestDept> testDeptList = getTestDeptList();
long start = System.currentTimeMillis();
for (TestUser testUser : testUserList) {
long deptId = testUser.getId();
String userName = testUser.getName();
for (TestDept testDept : testDeptList) {
long id = testDept.getId();
String name = testDept.getName();
if (deptId == id) {
System.out.println("用户名为"+userName+" 的部门信息为:" + name);
}
}
}
System.out.println("执行1 耗时为:" + (System.currentTimeMillis() - start) + " ms");
}
执行耗时
执行1 耗时为:21995 ms
优化
其实一眼就知道耗时是在第二个循环中,在第二次循环中如果匹配到了的话完全可以不用再接着往下继续循环了,比如说用户1匹配到了部门1,那么就不用再循环部门集合了,直接用终止就行了,那么如果终止呢?就是用break。我们用上试试
付费内容提示
该文档的全部内容仅对「码力全开」项目实战&技术讲解 知识星球用户开放
加入星球,一次获得完整项目资料、全栈技术知识库和长期答疑服务。
100万+字全栈技术知识库深入讲解技术核心、数据库、中间件和分布式等内容
8套热门的实战项目持续更新的企业级项目覆盖高并发、微服务、数据中台 和 AI Agent 等方向
AI 技术知识大模型面试详解覆盖 AI 模型原理、Agent、RAG、MCP、Skills、Harness 等核心知识点
文档 + 视频两种讲解形式既能系统阅读,也能跟随视频理解核心业务
完整项目实战资料
每套项目均包含从 0 到 1 讲解文档核心业务讲解视频从基础项目到复杂业务场景,项目资料会持续更新。
- 01Nexus Agent AI 智能体
- 02Nexus Agent Pro 完全版
- 03黑马点评Plus
- 04大麦
- 05大麦Pro
- 06大麦AI
- 07流量切换
- 08数据中台
加入后还能获得
进入星球后,即可享受上述所有服务,保证不会再有其他隐藏费用。从学习、面试到项目启动,都可以继续获得支持。
- 1 对 1 解答项目和技术问题都可以提问
- 针对性补充没有讲清楚的内容会继续补充
- 面试与简历指导梳理回答技巧和项目亮点
- 中间件云环境项目依赖可以直接接入使用
- 面试后复盘被问住的问题可以继续交流
- 远程问题解决项目启动问题可协助排查
