公司来了个新同事,把代码耗时从 26856ms 优化到了 748ms,一顿操作猛如虎! 📅 发布时间:2026/7/16 6:28:50 👁️ 浏览次数: 在两张表中查找相同 ID 的数据时许多开发者会使用两层for循环嵌套。这种写法效率较低本文将介绍一种提高查找速度的优化方法。场景在for循环内嵌套for循环进行数据匹配和处理。时间复杂度为 O(n*m)在数据量较大时性能会急剧下降。示例假设有两份List数据userList和userMemoList。需要遍历userList根据每个用户的userId从userMemoList中查找并取出对应userId的content值进行后续处理。import lombok.Data; import java.util.*; import java.util.stream.Collectors; import org.springframework.util.StringUtils; Data class User { private Long userId; private String name; } Data class UserMemo { private Long userId; private String content; } public class NestedLoopOptimization { public static ListUser getUserTestList() { ListUser 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 ListUserMemo getUserMemoTestList() { ListUserMemo 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; } // ... 后续代码 }模拟数据5 万条user数据3 万条userMemo数据。未优化的代码最直接的实现方式通过两层for循环进行匹配public static void nestedLoop(ListUser userTestList, ListUserMemo userMemoTestList) { 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); // 避免打印影响测试结果 } } } }耗时约数万毫秒 (5 万 * 3 万次迭代)。ps其实数据量小的话其实没多大性能差别不过我们还是需要知道一些技巧点。break 优化当每个userId在userMemoList中只有一条数据时找到匹配项后直接break跳出内循环public static void breakOptimizedLoop(ListUser userTestList, ListUserMemo userMemoTestList) { 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); // 避免打印影响测试结果 break; // 找到匹配项后跳出内循环 } } } }耗时仍然需要遍历较多次但比嵌套循环略有改善。使用 Map 优化public static void mapOptimizedLoop(ListUser userTestList, ListUserMemo userMemoTestList) { MapLong, String contentMap userMemoTestList.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 业务处理...... content); // 避免打印影响测试结果 } } }耗时显著减少通常在数百毫秒级别。原理两层for循环嵌套的时间复杂度为 O(n*m)其中 n 和 m 分别为两个列表的长度。使用Map后get操作的时间复杂度接近 O(1)整体时间复杂度降为 O(nm)避免了内循环的重复遍历。HashMap的get方法内部使用了getNode方法来查找键值对。getNode方法利用哈希表结构快速定位到目标键值对。虽然在极端情况下所有键的哈希值都相同getNode的时间复杂度会退化为 O(n)但在实际应用中哈希冲突的概率很低HashMap的get操作效率通常很高。因此无需过于担心O(n)的最坏情况.// HashMap.getNode() 方法的部分关键代码 (JDK8) final NodeK,V getNode(int hash, Object key) { // ... (省略部分代码) if (first.hash hash ((k first.key) key || (key ! null key.equals(k)))) return first; // 找到节点直接返回 // ... (省略处理哈希冲突的代码) }通过以上优化可以显著提高代码的执行效率。尤其是在处理大量数据时使用Map优化能够带来巨大的性能提升。避免了不必要的计算从而提升了代码的性能。总结优化方法时间复杂度适用场景性能提升未优化嵌套循环O(n * m)数据量较小时可接受最低耗时数万毫秒break优化O(n * m)数据量较小且userId唯一时适用略有提升减少内循环次数Map优化O(n m)数据量大且需要高效匹配时适用显著提升耗时百毫秒级
无人机视角动物牛羊斑马骆驼海豹驴检测数据集VOC+YOLO格式10000张6类别 数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):10000标注数量(xml文件个数):10000标注数量(txt文件个数):10000标注类… 2026/7/15 14:14:12
标智客 AI Logo设计生成神器评测报告 近年在 AI 技术的推动下,Logo 设计领域迎来了众多创新工具。其中,标智客作为一款智能 Logo 设计生成平台,凭借其便捷的操作和多样化的设计选项,迅速成为了市场上的热门工具之一。 它不仅仅是为专业设计师提供了一个高效的辅助创作… 2026/7/16 10:26:14
从极简到暗黑:六大专业灵感站点助你掌握当代设计趋势 在当今快速发展的数字设计世界中,寻找优质的设计灵感至关重要。无论你是专业设计师还是刚入行的新手,以下这些精选的网页设计灵感站点将帮助你提升创意和设计水平。兰亭妙微深耕 UI 设计与开发领域,团队设计师始终保持持续学习、稳步成长的状… 2026/7/14 0:21:32
大模型温度参数(Temperature)详解:如何设置与调优 1. 什么是温度参数(Temperature)? 温度(Temperature)是大语言模型(LLM)生成文本时的一个关键超参数,它控制着模型输出的随机性和创造性。简单来说,温度决定了模型在“选择… 2026/7/16 23:03:42
5步掌握FreeMoCap:免费开源运动捕捉系统完整指南 5步掌握FreeMoCap:免费开源运动捕捉系统完整指南 【免费下载链接】freemocap Free Motion Capture for Everyone 💀✨ 项目地址: https://gitcode.com/GitHub_Trending/fr/freemocap 想要体验专业级的3D运动捕捉和动作分析,却苦于高昂… 2026/7/16 23:03:42
Go06-数组、切片与 Map 第5章:数组、切片与 Map 5.1 数组 数组是固定长度的同类型元素序列。 声明与初始化 // 声明数组 var arr1 [5]int // [0 0 0 0 0]// 初始化 arr2 : [5]int{1, 2, 3, 4, 5}// 自动计算长度 arr3 : [...]int{1, 2, 3, 4, 5}// 指定索引初始化 arr4 : [5]int{1: 1… 2026/7/16 22:59:41
终极指南:3步在华为设备上免费安装Google服务替代方案 终极指南:3步在华为设备上免费安装Google服务替代方案 【免费下载链接】GmsCore Free implementation of Play Services 项目地址: https://gitcode.com/GitHub_Trending/gm/GmsCore 想在华为HarmonyOS设备上使用Google服务吗?microG Services为您… 2026/7/16 22:57:41
淘宝无人直播带货15.0:公域新玩法,稳定不封号 # 淘宝无人直播带货15.0:公域新玩法,稳定不封号## 引言在电商直播的浪潮中,淘宝作为国内最大的电商平台之一,一直是商家和主播争夺流量的主战场。然而,随着平台规则的日益严格,传统的真人直播模式面临人力成… 2026/7/16 22:57:41
Gemini多模态图像生成能力解密(官方未公开的prompt工程黑盒) 更多请点击: https://codechina.net 第一章:Gemini多模态图像生成能力解密(官方未公开的prompt工程黑盒) Gemini并非原生支持文本到图像生成,但通过其深度集成的多模态理解与跨模态推理能力,可协同Google … 2026/7/16 22:55:39
A--10 Codex Review与GitHub PR工作流实战指南:从代码审查到安全合并 摘要:本文系统讲解如何利用Codex App的Review功能与GitHub PR工作流,实现从代码修改到安全合并的完整流程。涵盖Review面板深度使用、/review命令实战、GitHub Connector配置、PR描述撰写技巧,以及常见问题排查方法。通过多个实战案例和流程图,帮助开发者建立高效的AI辅助代… 2026/7/16 0:00:26
HAM未来路线图:下一代高可用迁移技术的发展方向与展望 HAM未来路线图:下一代高可用迁移技术的发展方向与展望 【免费下载链接】ham Based on the remote memory access capability and high bandwidth of the UB, deterministic duration virtual machine live migration is achieved, addressing planned downtime issu… 2026/7/16 0:04:27
月球是否是从地球分离出去的?——容度原理解释 月球是否是从地球分离出去的?——容度原理解释一、月球起源的“三大假说”与容度原理的重新审视月球起源的三大假说——捕获说(月球是太阳系中独立的星体,被地球引力捕获)、共生说(月球与地球同时从原始星云中形成&… 2026/7/16 0:06:27
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/13 8:31:55
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/16 3:47:53
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/16 12:08:13