跳到主要内容

掌握这个优化双循环的技巧效率猛增百分之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。我们用上试试

付费内容提示

该文档的全部内容仅对「JavaUp项目实战&技术讲解」知识星球用户开放

加入星球后,你可以获得:

  • 超级八股文:100万+字的全栈技术知识库,涵盖技术核心、数据库、中间件、分布式等深度剖析的讲解
  • 讲解文档:黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的从0到1的550+详细文档
  • 讲解视频:黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的核心业务详细讲解
  • 1 对 1 解答:可以对我进行1对1的问题提问,而不仅仅只限于项目
  • 针对性服务:有没理解的地方,文档或者视频还没有讲到可以提出,本人会补充
  • 面试与简历指导:提供面试回答技巧,项目怎样写才能在简历中具有独特的亮点
  • 中间件环境:对于项目中需要使用的中间件,可直接替换成我提供的云环境
  • 面试后复盘:小伙伴去面试后,如果哪里被面试官问住了,可以再找我解答
  • 远程的解决:如果在启动项目遇到问题,本人可以帮你远程解决
进入星球后,即可享受上述所有服务,保证不会再有其他隐藏费用。
知识星球二维码

1. 打开微信 -> 扫描左侧二维码 -> 加入「JavaUp项目实战&技术讲解」知识星球

2. 查看星球使用指导,获取完整项目讲解资料索引

👉 点击解锁全部付费内容
🎁优惠