90% 的 Java 初学者都搞不懂的 List、Set、Map 区别

原文来自于:zha-ge.cn/java/21

90% 的 Java 初学者都搞不懂的 List、Set、Map 区别

引子:从一次面试翻车说起

上周面试一个应届生,我问了个看似简单的问题:"你能说说 List、Set、Map 的区别吗?"

小伙子很自信地回答:"List 是有序的,Set 是无序的,Map 是键值对。"

我接着问:"那 LinkedHashSet 呢?TreeSet 呢?"

他愣住了,支支吾吾半天说不出个所以然。其实这很正常,我发现大多数初学者都把这三个集合框架理解得过于表面,就像只看到了冰山一角。

探索:重新认识这三兄弟

让我们从一个真实场景开始。假设你在开发一个学生管理系统,需要存储学生信息。

List:我是"保姆型"集合

List 就像一个细心的保姆,什么都记得,什么都保留。你添加了重复的学生?没问题,我都给你留着。你想要第3个位置的学生?马上给你。

java 复制代码
List<String> students = new ArrayList<>();
students.add("张三");
students.add("李四");
students.add("张三");  // 允许重复
System.out.println(students.get(2)); // 通过索引访问:张三

关键特征:

  • 允许重复:同一个元素可以出现多次
  • 有索引 :可以通过 get(index) 访问
  • 插入有序:保持你添加的顺序

Set:我是"强迫症"集合

Set 就像有强迫症的室友,绝不允许重复。你试图添加相同的学生?抱歉,我直接忽略。

java 复制代码
Set<String> uniqueStudents = new HashSet<>();
uniqueStudents.add("张三");
uniqueStudents.add("李四");
uniqueStudents.add("张三");  // 这行无效!
System.out.println(uniqueStudents.size()); // 输出:2

但这里有个大坑!很多人以为 Set 就是无序的,其实不然:

  • HashSet:确实无序,纯粹为了去重
  • LinkedHashSet:保持插入顺序的 Set
  • TreeSet:自动排序的 Set

Map:我是"字典型"集合

Map 就像一本字典,每个 key 对应一个 value。你想根据学号查学生姓名?小菜一碟。

java 复制代码
Map<String, String> studentMap = new HashMap<>();
studentMap.put("S001", "张三");
studentMap.put("S002", "李四");
studentMap.put("S001", "王五");  // 覆盖张三!
System.out.println(studentMap.get("S001")); // 输出:王五

踩坑瞬间:那些年我们踩过的坑

坑1:以为 Set 都是无序的

java 复制代码
// 很多人以为这样会乱序
Set<String> set1 = new LinkedHashSet<>();
set1.add("first");
set1.add("second");
set1.add("third");
// 实际上 LinkedHashSet 保持插入顺序!

坑2:Map 的 key 重复覆盖

新手经常忘记 Map 的 key 是唯一的,重复添加会覆盖原值,不会报错!

坑3:List 的性能陷阱

ArrayList 在中间插入/删除性能很差,但通过索引访问很快。 LinkedList 正好相反。选错了数据结构,性能能差几十倍。

转折:真正的区别在哪里?

经过多年开发经验,我发现真正的区别不在于"有序无序",而在于:

特征 List Set Map
核心目的 保存序列 去重集合 键值映射
重复元素 允许 禁止 key禁止,value允许
访问方式 索引 + 遍历 遍历 key查找 + 遍历
典型场景 购物车商品 标签集合 配置项

经验启示:选择的艺术

选择集合类型,其实是在选择一种数据组织哲学

  1. 需要记住顺序、允许重复?选 List
  2. 只关心存在性、必须去重?选 Set
  3. 需要快速查找对应关系?选 Map

记住这句话:集合的选择,决定了你程序的性能天花板

总结:从表面到本质

List、Set、Map 的区别,表面上是数据结构的不同,本质上是解决问题思路的不同:

  • List 解决"序列"问题
  • Set 解决"去重"问题
  • Map 解决"映射"问题

下次有人问你这个问题,别再背书了。告诉他们:这不是语法问题,是设计思维问题。

选对了集合,代码简洁高效;选错了集合,debug 到天明。

你觉得呢?

相关推荐
忆~遂愿几秒前
GE 引擎进阶:依赖图的原子性管理与异构算子协作调度
java·开发语言·人工智能
MZ_ZXD0015 分钟前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
PP东8 分钟前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
ManThink Technology13 分钟前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
invicinble17 分钟前
springboot的核心实现机制原理
java·spring boot·后端
人道领域25 分钟前
SSM框架从入门到入土(AOP面向切面编程)
java·开发语言
大模型玩家七七1 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
CodeToGym1 小时前
【Java 办公自动化】Apache POI 入门:手把手教你实现 Excel 导入与导出
java·apache·excel
凡人叶枫1 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
JMchen1232 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio