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 到天明。

你觉得呢?

相关推荐
boy快快长大21 小时前
【Spring AI】简单入门(一)
java·人工智能·spring
失散1321 小时前
分布式专题——15 ZooKeeper特性与节点数据类型详解
java·分布式·zookeeper·云原生·架构
ThisIsMirror21 小时前
Spring的三级缓存如何解决单例Bean循环依赖
java·spring·缓存
菠菠萝宝21 小时前
【Java八股文】12-分布式面试篇
java·分布式·zookeeper·面试·seata·redisson
yk1001021 小时前
Spring DefaultSingletonBeanRegistry
java·后端·spring
Metaphor69221 小时前
Java 将 PDF 转换为 HTML:高效解决方案与实践
java·经验分享·pdf·html
yujkss21 小时前
23种设计模式之【原型模式】-核心原理与 Java实践
java·设计模式·原型模式
boy快快长大21 小时前
【场景题】如何解决大文件上传问题
java
qianmo202121 小时前
gpt-4o+deepseek+R生成热力图表
java·数据库·r语言
失散1321 小时前
分布式专题——20 Kafka快速入门
java·分布式·云原生·架构·kafka