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

你觉得呢?

相关推荐
何中应4 小时前
Spring Boot单体项目整合Nacos
java·spring boot·后端
dylan_QAQ4 小时前
Java转Go全过程01-基础语法部分
java·后端·go
Ka1Yan4 小时前
[算法] 双指针:本质是“分治思维“——从基础原理到实战的深度解析
java·开发语言·数据结构·算法·面试
轮子大叔5 小时前
Spark学习记录
java·spark
一语长情5 小时前
RocketMQ 消息队列冷读问题的分析与优化
java·后端·架构
smilejingwei5 小时前
数据分析编程第六步:大数据运算
java·大数据·开发语言·数据分析·编程·esprocspl
努力努力再努力wz6 小时前
【c++进阶系列】:万字详解异常
java·linux·运维·服务器·开发语言·c++
工一木子6 小时前
Java多线程基础:进程、线程与线程安全实战
java·多线程
渣哥6 小时前
阻塞 vs 非阻塞:IO 与 NIO 的正面对决
java