Collections 类常用方法源码剖析(基于 Java 11)
java.util.Collections
是一个专门用于操作集合(Collection、Map 等)的工具类,提供了大量静态方法,包括排序、搜索、同步包装、不可变包装等功能。与 Arrays
类类似,它采用工具类的设计模式:构造器私有,所有方法都是静态的。
📊 核心方法概览
方法类别 | 方法名 | 功能描述 | 关键特性 |
---|---|---|---|
排序操作 | sort() |
对 List 进行排序 | 使用修改的归并排序,保证稳定排序 |
reverse() |
反转 List 中元素顺序 | 使用双指针交换算法 | |
搜索操作 | binarySearch() |
二分查找已排序列表 | 要求列表已排序,性能 O(log n) |
同步包装 | synchronizedXxx() |
创建线程安全的集合包装器 | 方法级同步,使用 mutex 对象 |
不可变包装 | unmodifiableXxx() |
创建不可修改的集合视图 | 修改操作抛出异常 |
类型安全包装 | checkedXxx() |
创建类型安全的集合包装器 | 在运行时检查元素类型 |
特殊集合 | emptyXxx() |
返回空集合 | 单例模式,节省内存 |
singletonXxx() |
返回只包含一个元素的集合 | 不可变单元素集合 | |
其他工具 | shuffle() |
随机打乱列表顺序 | 使用默认或指定随机源 |
frequency() |
统计元素出现次数 | 基于 equals() 方法比较 |
🔍 核心方法源码深度解析
1. 排序操作
sort(List<T> list)
方法
public static <T extends Comparable<? super T>> void sort(List<T> list) {
list.sort(null);
}
// 更通用的排序方法
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
在 Java 8+ 中,Collections.sort()
实际上委托给了 List.sort()
方法。对于 ArrayList
,其 sort()
方法实现如下:
// ArrayList.java 中的 sort 方法
public void sort(Comparator<? super E> c) {
final int expectedModCount = modCount;
Arrays.sort((E[]) elementData, 0, size, c);
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
modCount++;
}
最终调用的是 Arrays.sort()
,对于对象数组使用 TimSort 算法:
// Arrays.java
public static <T> void sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c) {
if (c == null) {
sort(a, fromIndex, toIndex); // 使用自然排序
} else {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, fromIndex, toIndex, c); // 传统归并排序
<