Java 集合框架架构:15 分钟快速回顾指南
概述
Java 集合框架是处理对象集合的统一架构,简化了数据存储、查询和操作的实现。它像一个 “容器工具箱”,提供了各种数据结构(如列表、集合、映射),让开发者无需重复造轮子。
核心价值:统一接口 + 多样实现—— 无论使用ArrayList还是HashMap,都能通过标准化方法操作,降低学习和使用成本。
一、集合框架整体架构(UML 类图核心)
集合框架分为两大体系:Collection(存储单元素) 和Map(存储键值对)。以下是简化的继承关系图(建议手绘时参考):
┌─────────────────────────────────────────┐
│ Iterable接口 │ // 所有集合的根接口,支持迭代(foreach循环)
└───────────────────┬─────────────────────┘
↓
┌─────────────────────────────────────────┐
│ Collection接口 │ // 单元素集合的顶层接口
├───────────────┬────────────┬────────────┤
│ │ │ │
↓ ↓ ↓ ↓
┌──────────┐ ┌─────────┐ ┌────────┐ ┌──────────┐
│ List │ │ Set │ │ Queue │ │ ... │ // 子接口(按特性分类)
└────┬─────┘ └────┬────┘ └────┬───┘ └──────────┘
│ │ │
↓ ↓ ↓
┌──────────┐ ┌─────────┐ ┌────────┐
│ArrayList │ │HashSet │ │LinkedList│ // 典型实现类
│LinkedList│ │TreeSet │ │PriorityQueue│
└──────────┘ └─────────┘ └────────┘
// 独立体系:Map(键值对存储)
┌─────────────────────────────────────────┐
│ Map接口 │ // 键值对集合顶层接口
├───────────────┬────────────┬────────────┤
│ │ │ │
↓ ↓ ↓ ↓
┌──────────┐ ┌─────────┐ ┌────────┐ ┌──────────┐
│HashMap │ │TreeMap │ │LinkedHashMap│ │Hashtable │ // 实现类
└──────────┘ └─────────┘ └────────┘ └──────────┘
二、核心体系详解
1. Collection 体系(单元素集合)
特点:存储单个对象,继承Iterable接口,支持迭代遍历。
(1)List 接口
-
核心特性:有序(元素插入顺序可保持)、可重复(允许元素值相同)、有索引(可通过下标访问)。
-
典型实现类:
-
- ArrayList:底层是动态数组,查询快(随机访问)、增删慢(需移动元素),适合读多写少场景(如展示列表)。
-
- LinkedList:底层是双向链表,增删快(只需修改指针)、查询慢(需遍历),适合频繁插入删除场景(如队列、栈)。
-
代码示例:
// ArrayList示例
List<String> arrayList = new ArrayList<>();
arrayList.add("apple"); // 有序添加
arrayList.add("banana");
arrayList.get(0); // 快速查询(O(1))
// LinkedList示例
List<String> linkedList = new LinkedList<>();
linkedList.add("cat");
linkedList.addFirst("dog"); // 头部插入(O(1))
(2)Set 接口
-
核心特性:无序(HashSet)、不可重复(元素需重写equals()和hashCode())。
-
典型实现类:
-
- HashSet:底层是哈希表,查询 / 增删效率高(O (1)),适合去重场景(如存储用户 ID)。
-
- TreeSet:底层是红黑树,元素自动排序(自然排序或定制排序),适合需要排序的去重场景(如排行榜)。
-
- LinkedHashSet:继承 HashSet,同时维护插入顺序,兼顾去重和顺序需求。
-
代码示例:
// HashSet去重
Set<String> hashSet = new HashSet<>();
hashSet.add("apple");
hashSet.add("apple"); // 重复元素会被忽略
System.out.println(hashSet.size()); // 输出:1
// TreeSet排序
Set<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(1);
System.out.println(treeSet); // 输出:[1, 3](自动排序)
(3)Queue 接口
-
核心特性:先进先出(FIFO),主要用于存储待处理元素(如任务队列)。
-
典型实现类:
-
- LinkedList:实现了 Queue 接口,可作为普通队列使用。
-
- PriorityQueue:优先队列,元素按优先级出队(非 FIFO),适合任务调度场景。
-
代码示例:
// 普通队列(FIFO)
Queue<String> queue = new LinkedList<>();
queue.offer("任务1"); // 入队
queue.offer("任务2");
System.out.println(queue.poll()); // 出队:任务1(先入先出)
// 优先队列(按自然顺序)
Queue<Integer> priorityQueue = new PriorityQueue<>();
priorityQueue.offer(3);
priorityQueue.offer(1);
System.out.println(priorityQueue.poll()); // 出队:1(优先级高)
2. Map 体系(键值对集合)
特点:存储Key-Value键值对,Key 唯一(重复会覆盖),Value 可重复,通过 Key 快速查询 Value。
典型实现类
-
HashMap:底层是哈希表,查询 / 增删效率高(O (1)),Key 无序,适合普通键值对存储(如配置信息)。
-
TreeMap:底层是红黑树,Key 自动排序,适合需要按 Key 排序的场景(如字典)。
-
LinkedHashMap:继承 HashMap,维护 Key 的插入顺序,适合需要保留插入顺序的场景(如缓存)。
-
代码示例:
// HashMap示例
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("apple", 10); // 存储键值对
hashMap.put("banana", 20);
System.out.println(hashMap.get("apple")); // 查询:10
// TreeMap排序(按Key自然顺序)
Map<String, Integer> treeMap = new TreeMap<>();
treeMap.put("b", 2);
treeMap.put("a", 1);
System.out.println(treeMap.keySet()); // 输出:[a, b](Key排序)
三、实用技巧:集合选择决策树
面对场景不知选哪种集合?按以下步骤判断:
- 是否需要键值对存储?
-
- 是 → 选Map体系(HashMap/TreeMap)。
-
- 否 → 进入Collection体系。
- 是否允许重复元素?
-
- 是 → 选List(ArrayList/LinkedList)。
-
- 否 → 选Set(HashSet/TreeSet)。
- 是否需要排序?
-
- 是 → TreeSet(Set)/TreeMap(Map)。
-
- 否 → 优先选 HashSet/HashMap(效率更高)。
- 是否需要保持插入顺序?
-
- 是 → LinkedHashSet/LinkedHashMap/LinkedList。
四、注意事项
-
线程安全:集合框架中大部分类(如 ArrayList、HashMap)是非线程安全的,多线程环境需使用Collections.synchronizedList()等包装类,或ConcurrentHashMap。
-
null 值处理:
-
- ArrayList允许 null 值,HashSet允许一个 null 值。
-
- HashMap允许 Key 为 null(仅一个),Value 可为 null;Hashtable不允许 null。
- 重写方法:使用HashSet或HashMap时,元素(Key)需重写equals()和hashCode(),否则可能导致去重失效。
总结:核心要点速览
体系 | 接口 / 类 | 核心特性 | 典型场景 |
---|---|---|---|
Collection | List(ArrayList) | 有序、可重复、查询快 | 展示列表、读多写少 |
Set(HashSet) | 无序、不可重复、效率高 | 去重(如用户 ID) | |
Queue | FIFO / 优先级 | 任务队列、调度 | |
Map | HashMap | 键值对、无序、效率高 | 配置存储、快速查询 |
TreeMap | 键值对、Key 排序 | 字典、按 Key 排序的数据 |
15 分钟内,通过手绘 UML 图 + 记忆核心特性,即可掌握集合框架的整体架构。关键是理解 “接口定规则,实现类定细节” 的设计思想,根据场景灵活选择合适的集合~