Java 中的 集合类 是用来存储和操作数据的一组工具,分为 List、Set、Queue 和 Map 四种类型。每种集合类型根据不同的需求有不同的特点,比如 数据顺序、是否允许重复元素、是否线程安全 等。每种集合类型也有不同的 性能表现,所以根据实际需求选择合适的集合类是提升代码 效率 的一个重要方法。

📚 知识内容
🧩 1. 集合框架的基本分类
Java 的集合框架包含了很多实现不同接口的类,我们将其分为四大类:

List(列表)
有序集合,允许重复元素。按插入顺序保存数据,常用的实现类有 ArrayList 和 LinkedList。

Set(集合)
不允许重复元素,无序集合。常用的实现类有 HashSet、LinkedHashSet 和 TreeSet。

Queue(队列)
按照先进先出(FIFO)原则操作元素,常用的实现类有 PriorityQueue 和 ArrayDeque。

Map(映射)
存储键值对,不允许重复的键。常用的实现类有 HashMap、TreeMap 和 LinkedHashMap。

🌱 1.1 List(列表)
特点:有序,可以 重复元素,可以通过 索引 访问元素。
常用实现类:
ArrayList:基于数组实现,查找速度快,但插入删除性能差。
LinkedList:基于链表实现,插入删除性能高,但查找慢。
代码示例:

List list = new ArrayList<>();
list.add(“A”);
list.add(“B”);
list.add(“A”);

for (String s : list) {
System.out.println(s); // 输出:A, B, A
}

深入解析:

ArrayList 是一个基于数组的实现类,适合查找、访问频繁的场景(时间复杂度为 O(1)),但如果频繁进行插入、删除操作时,由于数组扩容的原因,会出现性能瓶颈。
LinkedList 则是一个基于双向链表的实现,适合进行频繁的插入、删除操作(时间复杂度为 O(1)),但是访问元素时需要遍历链表,性能较差。
🌱 1.2 Set(集合)
特点:无序,不允许重复元素。
常用实现类:
HashSet:基于哈希表实现,查找、插入、删除操作时间复杂度较低(O(1))。
LinkedHashSet:保持元素的插入顺序,基于哈希表实现。
TreeSet:基于红黑树实现,元素是 有序 的,查找、插入、删除的时间复杂度是 O(log N)。
代码示例:

Set set = new HashSet<>();
set.add(“A”);
set.add(“B”);
set.add(“A”); // 添加重复元素,不会插入

for (String s : set) {
System.out.println(s); // 输出:A, B(无顺序)
}

深入解析:

HashSet 是 Set 接口的最常用实现,基于哈希表实现,它的查找、插入、删除操作时间复杂度为 O(1),但是它不保证元素的顺序。如果你对元素顺序有要求,可以考虑使用 LinkedHashSet。
TreeSet 则提供了元素的 自然顺序 或自定义排序,它的性能相对较低,特别是在进行插入、删除操作时,它的时间复杂度为 O(log N)。
🌱 1.3 Queue(队列)
特点:先进先出(FIFO),适用于排队场景。
常用实现类:
PriorityQueue:基于堆实现,元素根据优先级排序。
ArrayDeque:基于数组实现,作为栈和队列都可以使用。
代码示例:

Queue queue = new LinkedList<>();
queue.offer(“A”);
queue.offer(“B”);
queue.offer(“C”);

System.out.println(queue.poll()); // 输出:A,出队列

深入解析:

PriorityQueue 是一个优先队列,内部元素是按照其自然排序或指定的比较器排序的。它适用于需要按优先级处理任务的场景,比如任务调度等。
ArrayDeque 则是一个双端队列,它能够作为栈(后进先出)或队列(先进先出)使用,基于动态数组实现,性能较高,不如 LinkedList 占用更多的内存。
🌱 1.4 Map(映射)
特点:键值对集合,不允许重复的键,每个键对应一个值。
常用实现类:
HashMap:基于哈希表实现,查找、插入、删除操作时间复杂度为 O(1)。
LinkedHashMap:与 HashMap 类似,但保留插入顺序。
TreeMap:基于红黑树实现,键是 有序 的,查找、插入、删除的时间复杂度为 O(log N)。
代码示例:

Map<String, Integer> map = new HashMap<>();
map.put(“A”, 1);
map.put(“B”, 2);
map.put(“A”, 3); // 更新键”A”对应的值

System.out.println(map.get(“A”)); // 输出:3

深入解析:

HashMap 是最常用的 Map 实现类,具有较高的性能,查找、插入、删除的时间复杂度为 O(1),但它不保证元素的顺序。
LinkedHashMap 则是在 HashMap 的基础上,增加了元素的插入顺序。它适用于需要保持插入顺序的场景。
TreeMap 提供了 自然顺序 或自定义排序,键的顺序是有保证的,但性能相对较差。
🌟 2. 为什么有这么多种集合类?
集合类的设计旨在满足不同的需求,不同的实现类提供了不同的性能和特性。具体来说:

List 用于有序的数据结构,适合访问频繁的场景。
Set 用于去重和无序存储,适合需要唯一元素的场景。
Queue 适用于排队场景,比如任务调度。
Map 用于存储键值对,适合快速查找。
选择合适的集合类可以 提高程序性能,减少不必要的资源消耗。

🔍 知识拓展
🌟 1. Collection 和 Map 的区别
Collection 是集合框架的根接口,包含了 List、Set 和 Queue,而 Map 存储的是 键值对,和 Collection 并列是集合框架的核心部分。
区别:

Collection:存储单一元素,支持迭代操作。
Map:存储键值对,键不能重复。
🌟 2. Map 的线程安全版本
常用的 Map 实现类(如 HashMap)是非线程安全的。为了在多线程环境下使用,Java 提供了线程安全的 Map:

Hashtable:基于锁实现,线程安全,但性能较差。
ConcurrentHashMap:基于分段锁实现,性能更高,适用于高并发场景。
🌟 3. 集合的性能比较
集合类型 优点 缺点
ArrayList 访问快速(O(1)),动态扩展 插入/删除操作慢(O(n))
LinkedList 插入/删除操作快(O(1)) 访问操作慢(O(n))
HashSet 插入、查找、删除操作快(O(1)) 不保证元素顺序
TreeSet 元素自动排序 插入/查找操作较慢(O(log n))
HashMap 查找、插入、删除操作快(O(1)) 不保证元素顺序
TreeMap 键自动排序 插入/查找操作较慢(O(log n))
🌟
4. 集合框架的其他重要类

Collections 类:提供了对集合的静态方法,如排序、反转、查找等。
Arrays 类:提供了对数组的操作,如排序、转换成集合等。
💾 总结:Java 的集合类体系庞大且丰富,每种集合类有不同的适用场景。在选择集合时,我们需要根据具体的业务需求,考虑它们的性能特点和特性,以达到最优的设计和实现效果。