Java集合框架基础:单列集合与双列集合,别再傻傻分不清了!
作为一个刚学Java的大一新生,每天都在“学了忘、忘了学”中反复横跳。今天整理了一下集合框架的基础知识,尤其是单列集合和双列集合的区别,希望能帮到和我一样容易混淆的小伙伴们。
一、为什么要学集合?
刚开始学Java时,我们用的是数组来存数据。但数组有个很大的问题:长度固定,一旦创建就不能改变。如果我们要存的数据量不确定,数组就不太好用了。
这时候,集合就派上用场了。集合就像一个可变的容器,可以动态地存储多个对象,而且提供了很多方便的方法(增、删、改、查)。
Java的集合框架主要分为两大类:
-
单列集合:一次存一个元素
-
双列集合:一次存一对元素(键 + 值)
二、单列集合(Collection)
单列集合的根接口是 Collection,它下面主要有三个子接口:List、Set、Queue。
1. List(列表)
特点:
-
有序:存进去的顺序和取出来的顺序一致
-
可重复:可以存相同的元素
-
允许
null值
| 实现类 | 底层结构 | 特点 | 使用场景 |
|---|---|---|---|
ArrayList |
数组 | 查询快、增删慢 | 适合频繁查询、少量增删 |
LinkedList |
双向链表 | 增删快、查询慢 | 适合频繁增删 |
Vector |
数组 | 线程安全,但效率低 | 老项目,现在很少用 |
// 示例:ArrayList
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("Java"); // 可以重复
System.out.println(list); // [Java, Python, Java]
2. Set(集)
特点:
-
无序(不保证顺序,但部分实现类有序)
-
不可重复(自动去重)
-
元素唯一性依赖
hashCode()和equals()
| 实现类 | 底层结构 | 特点 |
|---|---|---|
HashSet |
HashMap | 无序,依赖哈希表 |
LinkedHashSet |
HashMap + 链表 | 保持插入顺序 |
TreeSet |
红黑树 | 自动排序 |
// 示例:HashSet自动去重
Set<String> set = new HashSet<>();
set.add("Java");
set.add("Python");
set.add("Java"); // 重复的不会被加入
System.out.println(set); // [Java, Python] (顺序可能不同)
3. Queue(队列)
特点:
-
通常遵循先进先出(FIFO)原则
-
用于在两端进行元素的插入和移除
// 示例:队列
Queue<String> queue = new LinkedList<>();
queue.offer("任务1");
queue.offer("任务2");
System.out.println(queue.poll()); // 任务1
三、双列集合(Map)
双列集合的根接口是 Map,存储的是键值对(Key-Value),通过键来查找值。
核心特点:
-
键不可重复,值可以重复
-
一个键对应一个值
| 实现类 | 底层结构 | 特点 |
|---|---|---|
HashMap |
哈希表 | 键无序,允许一个 null 键,非线程安全 |
LinkedHashMap |
哈希表 + 链表 | 键保持插入顺序 |
TreeMap |
红黑树 | 键自动排序 |
Hashtable |
哈希表 | 线程安全,键和值都不能为 null(老古董) |
// 示例:HashMap
Map<String, Integer> map = new HashMap<>();
map.put("苹果", 5);
map.put("香蕉", 3);
map.put("苹果", 8); // 键重复,会覆盖之前的值
System.out.println(map); // {苹果=8, 香蕉=3}
// 通过键获取值
System.out.println(map.get("苹果")); // 8
四、单列 vs 双列:一张图看懂
| 对比点 | 单列集合(Collection) | 双列集合(Map) |
|---|---|---|
| 存储单位 | 一个一个存 | 一对一对存(键+值) |
| 根接口 | Collection |
Map |
| 重复规则 | List可重复,Set不可重复 | 键不可重复,值可重复 |
| 获取元素 | 直接拿元素 | 通过键拿值 |
| 常用实现 | ArrayList,HashSet |
HashMap,TreeMap |
五、它们之间有什么联系?
虽然 Map 和 Collection 没有继承关系,但它们可以互相转换:
-
Map → Collection
-
keySet():获取所有键的Set集合 -
values():获取所有值的Collection集合 -
entrySet():获取所有键值对的Set集合(遍历时常用)
-
-
Set 底层依赖 Map
-
HashSet内部其实就是一个HashMap,把元素作为 Key,Value 统一用一个固定的对象占位。
-
六、什么时候用哪个?
| 场景 | 推荐集合 |
|---|---|
| 存一堆数据,需要按顺序取 | ArrayList |
| 存一堆数据,需要去重 | HashSet |
| 存一堆数据,需要自动排序 | TreeSet |
| 需要根据“学号”找到“学生” | HashMap |
| 需要根据“键”排序 | TreeMap |
| 频繁在中间插入/删除 | LinkedList |
七、一个小总结
刚学集合的时候,我经常搞不清楚什么时候用 List 什么时候用 Set,也老是忘记 HashMap 的特点。后来我给自己总结了一句口诀:
List 有序可重复,Set 无序不重复,Map 存的是键值对,键不重复值随便。
如果你也在学Java,希望这篇文章对你有帮助。如果发现有不对的地方,欢迎在评论区指正,我们一起进步!
我是香蕉掠夺者,一个正在努力学Java的大一新生,记录每天学到的知识,避免下次再忘记!
更多推荐




所有评论(0)