作为一个刚学Java的大一新生,每天都在“学了忘、忘了学”中反复横跳。今天整理了一下集合框架的基础知识,尤其是单列集合双列集合的区别,希望能帮到和我一样容易混淆的小伙伴们。

一、为什么要学集合?

刚开始学Java时,我们用的是数组来存数据。但数组有个很大的问题:长度固定,一旦创建就不能改变。如果我们要存的数据量不确定,数组就不太好用了。

这时候,集合就派上用场了。集合就像一个可变的容器,可以动态地存储多个对象,而且提供了很多方便的方法(增、删、改、查)。

Java的集合框架主要分为两大类:

  • 单列集合:一次存一个元素

  • 双列集合:一次存一对元素(键 + 值)

二、单列集合(Collection)

单列集合的根接口是 Collection,它下面主要有三个子接口:ListSetQueue

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不可重复 键不可重复,值可重复
获取元素 直接拿元素 通过键拿值
常用实现 ArrayListHashSet HashMapTreeMap

五、它们之间有什么联系?

虽然 Map 和 Collection 没有继承关系,但它们可以互相转换:

  1. Map → Collection

    • keySet():获取所有键的 Set 集合

    • values():获取所有值的 Collection 集合

    • entrySet():获取所有键值对的 Set 集合(遍历时常用)

  2. Set 底层依赖 Map

    • HashSet 内部其实就是一个 HashMap,把元素作为 Key,Value 统一用一个固定的对象占位。

六、什么时候用哪个?

场景 推荐集合
存一堆数据,需要按顺序取 ArrayList
存一堆数据,需要去重 HashSet
存一堆数据,需要自动排序 TreeSet
需要根据“学号”找到“学生” HashMap
需要根据“键”排序 TreeMap
频繁在中间插入/删除 LinkedList

七、一个小总结

刚学集合的时候,我经常搞不清楚什么时候用 List 什么时候用 Set,也老是忘记 HashMap 的特点。后来我给自己总结了一句口诀:

List 有序可重复,Set 无序不重复,Map 存的是键值对,键不重复值随便。

如果你也在学Java,希望这篇文章对你有帮助。如果发现有不对的地方,欢迎在评论区指正,我们一起进步!


我是香蕉掠夺者,一个正在努力学Java的大一新生,记录每天学到的知识,避免下次再忘记!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐