亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

90% 的 Java 初學者都搞不懂的 List、Set、Map 區別

標簽:
Java JavaScript

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

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

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

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

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

我接着问:“那 LinkedHashSet 呢?TreeSet 呢?”

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

探索:重新认识这三兄弟

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

List:我是"保姆型"集合

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

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

关键特征:

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

Set:我是"强迫症"集合

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

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。你想根据学号查学生姓名?小菜一碟。

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

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

坑1:以为 Set 都是无序的

// 很多人以为这样会乱序
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 到天明。

你觉得呢?

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消