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

你觉得呢?

相关推荐
青云交1 小时前
Java 大视界 -- 基于 Java 的大数据机器学习模型在图像识别中的迁移学习与模型优化
java·大数据·迁移学习·图像识别·模型优化·deeplearning4j·机器学习模型
2501_909800812 小时前
Java 集合框架之 Set 接口
java·set接口
断剑zou天涯2 小时前
【算法笔记】暴力递归尝试
java·笔记·算法
Nobody_Cares3 小时前
JWT令牌
java
沐浴露z3 小时前
Kafka入门:基础架构讲解,安装与使用
java·分布式·kafka
神秘的土鸡3 小时前
从数据仓库到数据中台再到数据飞轮:我的数据技术成长之路
java·服务器·aigc·数据库架构·1024程序员节
vir023 小时前
P1928 外星密码(dfs)
java·数据结构·算法·深度优先·1024程序员节
摇滚侠3 小时前
全面掌握PostgreSQL关系型数据库,备份和恢复,笔记46和笔记47
java·数据库·笔记·postgresql·1024程序员节
eguid_15 小时前
【开源项目分享】JNSM1.2.0,支持批量管理的jar包安装成Windows服务可视化工具,基于Java实现的支持批量管理已经安装服务的可视化工具
java·开源·jar·1024程序员节·windows服务·jar包安装成服务·exe安装成服务
杯莫停丶5 小时前
设计模式之:享元模式
java·设计模式·享元模式