
Java 集合框架实战:老项目中 List、Map、Set 的最佳实践
Java 集合框架看似简单,其实是构建高质量代码的关键基础设施。合理选择集合类,不仅可以减少代码量、提升可读性,也能显著提高性能和稳定性。有序+可重复 → 用List无序+去重 → 用Set键值关系 → 用Map特殊需求(排序、并发、顺序)根据实现类选择对于老项目开发者而言,这种知识的“回炉”既是技术升级,也是一次和过往代码对话的过程。希望这篇文章能帮你写得更顺手、改得更安心。
📝 摘要
Java 的集合框架(List、Map、Set)几乎无处不在,尤其在老项目中更是“万金油”工具。然而,很多初学者在刚接触这些集合类时容易混淆用法,甚至在维护老代码时出现误用、性能问题或逻辑错误。
本篇文章将以一个正在回写老项目的开发者视角,详细梳理 List、Map 和 Set 在实际项目中的典型用法、使用场景、常见坑点以及最佳实践。文章适合 Java 初学者阅读,也为有经验的开发者提供复盘与优化的参考。
博主 默语带您 Go to New World.
✍ 个人主页—— 默语 的博客👦🏻 优秀内容
《java 面试题大全》
《java 专栏》
《idea技术专区》
《spring boot 技术专区》
《MyBatis从入门到精通》
《23种设计模式》
《经典算法学习》
《spring 学习》
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨
默语是谁?
大家好,我是 默语,别名默语博主,擅长的技术领域包括Java、运维和人工智能。我的技术背景扎实,涵盖了从后端开发到前端框架的各个方面,特别是在Java 性能优化、多线程编程、算法优化等领域有深厚造诣。
目前,我活跃在CSDN、掘金、阿里云和 51CTO等平台,全网拥有超过15万的粉丝,总阅读量超过1400 万。统一 IP 名称为 默语 或者 默语博主。我是 CSDN 博客专家、阿里云专家博主和掘金博客专家,曾获博客专家、优秀社区主理人等多项荣誉,并在 2023 年度博客之星评选中名列前 50。我还是 Java 高级工程师、自媒体博主,北京城市开发者社区的主理人,拥有丰富的项目开发经验和产品设计能力。希望通过我的分享,帮助大家更好地了解和使用各类技术产品,在不断的学习过程中,可以帮助到更多的人,结交更多的朋友.
我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。
默语:您的前沿技术领航员
👋 大家好,我是默语!
📱 全网搜索“默语”,即可纵览我在各大平台的知识足迹。📣 公众号“默语摸鱼”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“Solitudemind”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 4 月 7 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!
Java 集合框架实战:老项目中 List、Map、Set 的最佳实践
📌 作者:默语
📅 日期:2025年4月7日
🏷️ 标签:Java、集合框架、List、Map、Set、开发实践、Eclipse、Java基础
📖 引言:为何集合类如此重要?
集合类是 Java 中用于存储一组数据的核心组件。相比数组,它们具有:
- 更强的扩展性(动态扩容)
- 更丰富的操作方法(如排序、查找、过滤)
- 更好的抽象封装(面向接口编程)
但也正因为选择多样,我们更需要明确使用场景和每个集合的优势,避免“能跑就行”的临时写法埋下后期维护的雷。
🧱 基础知识回顾:List、Set、Map 的区别
特性/类型 | List | Set | Map |
---|---|---|---|
是否允许重复元素 | ✅ 允许 | ❌ 不允许 | ✅ 允许重复 value,❌ key 唯一 |
是否有序 | ✅ 保持插入顺序 | 依实现类而定(HashSet 无序,TreeSet 有序) | 依实现类而定(HashMap 无序,LinkedHashMap 有序) |
典型实现类 | ArrayList, LinkedList | HashSet, TreeSet | HashMap, LinkedHashMap |
🔍 List 实战:ArrayList 与 LinkedList 的取舍
✅ 推荐使用场景
- 需要维护元素顺序
- 频繁查找、遍历场景(推荐
ArrayList
) - 频繁插入/删除操作(推荐
LinkedList
)
✍️ 代码示例
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Alice"); // 允许重复
System.out.println(names); // [Alice, Bob, Alice]
💡 小贴士
- 使用
ArrayList
大多数时候性能更优; - 初始化时设定容量可提升性能:
new ArrayList<>(100)
; - 遍历时建议用增强 for 循环或 stream(更安全);
- 注意:并发修改时需使用
CopyOnWriteArrayList
或加锁。
🧩 Set 实战:如何实现数据去重
✅ 推荐使用场景
- 元素必须唯一(如用户ID、标签、关键词等)
- 需要集合操作(交集、并集、差集)
- 无需关注元素顺序(用
HashSet
)
✍️ 代码示例:简单去重
Set<String> tags = new HashSet<>();
tags.add("Java");
tags.add("Spring");
tags.add("Java"); // 自动去重
System.out.println(tags); // 输出可能是 [Spring, Java]
✍️ 代码示例:有序去重
Set<String> tags = new TreeSet<>();
tags.add("Java");
tags.add("Spring");
tags.add("Java");
System.out.println(tags); // [Java, Spring],按字典序排序
💡 小贴士
HashSet
基于HashMap
实现,性能较高;- 如果你需要按添加顺序保留,用
LinkedHashSet
; - 若元素是对象,请重写
equals()
和hashCode()
方法,避免去重失败。
🗺️ Map 实战:用键值对结构优化代码逻辑
✅ 推荐使用场景
- 快速通过 key 找 value(如配置表、缓存表)
- 替代 if-else 的结构化逻辑
- 建立双向关系或索引
✍️ 代码示例:基本使用
Map<String, String> userMap = new HashMap<>();
userMap.put("001", "Alice");
userMap.put("002", "Bob");
System.out.println(userMap.get("001")); // 输出:Alice
✍️ 替代 if-else 的技巧
Map<String, Runnable> actionMap = new HashMap<>();
actionMap.put("login", () -> System.out.println("登录中"));
actionMap.put("logout", () -> System.out.println("登出中"));
String action = "login";
actionMap.getOrDefault(action, () -> System.out.println("未知操作")).run();
💡 小贴士
HashMap
是最常用实现,默认线程不安全;- 遍历 Map 时推荐使用
entrySet()
而非keySet()
+get()
; - 如果你需要顺序插入,请使用
LinkedHashMap
; - 线程安全需求可选
ConcurrentHashMap
。
🚨 集合类常见坑盘点(小白一定要避开)
场景 | 错误示例 | 建议做法 |
---|---|---|
遍历过程中修改集合 | 使用普通 for 循环时 list.remove() |
改用 Iterator 的 remove() |
使用 Set 存放对象 | 未重写 equals() 和 hashCode() |
定义在类中 |
使用 Map 判断 key 是否存在 | map.get(key) == null |
用 map.containsKey(key) 更保险 |
并发环境使用普通集合 | 多线程修改 ArrayList 、HashMap |
使用 Collections.synchronizedXXX() 或并发类 |
🧠 总结:结合实际场景选对集合类
Java 集合框架看似简单,其实是构建高质量代码的关键基础设施。合理选择集合类,不仅可以减少代码量、提升可读性,也能显著提高性能和稳定性。
✨ 回顾核心建议:
- 有序+可重复 → 用
List
- 无序+去重 → 用
Set
- 键值关系 → 用
Map
- 特殊需求(排序、并发、顺序)根据实现类选择
对于老项目开发者而言,这种知识的“回炉”既是技术升级,也是一次和过往代码对话的过程。希望这篇文章能帮你写得更顺手、改得更安心。
📚 参考资料
- 《Java 编程思想》第四版
- Oracle 官方 Java 集合文档
- Effective Java(第3版)
- Java 源码阅读系列(极客时间)
如你所见,一步步捡回基础,也是一种沉稳的进步。
——默语 🌱
如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;( 联系微信:Solitudemind )
点击下方名片,加入 IT 技术核心学习团队。一起探索科技的未来,共同成长。
为了让您拥有更好的交互体验,特将这行文字设置为可点击样式:点击下方名片,加入 IT
技术核心学习团队。一起探索科技的未来,共同成长。
更多推荐
所有评论(0)