一、Collections 工具类
1. 核心定位
java.util.Collections 是一个集合工具类,而非集合本身,它提供了一系列静态方法,用于对集合进行操作和处理。
2. 常用 API
表格
| 方法名 | 说明 |
|---|---|
public static <T> boolean addAll(Collection<T> c, T... elements) |
批量添加元素到集合中 |
public static void shuffle(List<?> list) |
打乱 List 集合中元素的顺序 |
public static <T> void sort(List<T> list) |
根据自然排序对 List 进行排序 |
public static <T> void sort(List<T> list, Comparator<T> c) |
根据指定比较器对 List 进行排序 |
public static <T> int binarySearch(List<T> list, T key) |
在有序 List 中以二分查找法查找元素 |
public static <T> void copy(List<T> dest, List<T> src) |
将源集合元素拷贝到目标集合 |
public static <T> int fill(List<T> list, T obj) |
使用指定元素填充整个集合 |
public static <T> T max/min(Collection<T> coll) |
根据自然排序获取集合中的最大 / 最小值 |
public static <T> void swap(List<?> list, int i, int j) |
交换集合中指定索引位置的两个元素 |
二、可变参数
1. 核心特性
- 本质:可变参数本质上就是一个数组。
- 作用:在方法形参中接收同类型的多个数据,使方法调用更灵活。
- 格式 :
数据类型... 参数名,例如int... a。
2. 注意事项
- 一个方法的形参列表中,可变参数只能有一个。
- 可变参数必须放在形参列表的最后面。
三、不可变集合
1. 核心定义
不可变集合是指创建后不能被修改的集合,即不能进行添加、删除或修改元素的操作。
2. 创建方式
在 List、Set、Map 接口中,都提供了静态的 of() 方法,用于创建不可变集合:
表格
| 方法名 | 说明 |
|---|---|
static <E> List<E> of(E... elements) |
创建一个包含指定元素的不可变 List 集合 |
static <E> Set<E> of(E... elements) |
创建一个包含指定元素的不可变 Set 集合 |
static <K, V> Map<K, V> of(K k1, V v1, ...) |
创建一个包含指定键值对的不可变 Map 集合 |
3. 注意事项
- 创建后的集合不能添加、删除或修改任何元素。
- 当创建不可变
Set或Map集合时,传入的参数(键)必须保证唯一性,否则会抛出异常。
四、创建不可变 Map 的两种方式
1. 传统方式:Map.ofEntries()
java
运行
Map<Object, Object> map = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));
- 原理 :
- 先通过
hm.entrySet()获取原 Map 的所有键值对(Entry对象)。 - 调用
toArray(new Map.Entry[0])将Set<Entry>转换为Entry数组。 - 最后使用
Map.ofEntries()方法,将数组中的所有Entry转换为一个新的不可变 Map。
- 先通过
2. 简化方式:Map.copyOf()(Java 10+)
java
运行
Map<String, String> map = Map.copyOf(hm);
- 原理 :这是一个更简洁的静态方法,它直接接收一个现有的 Map
hm,并返回一个包含其所有键值对的不可变副本。
五、创建不可变 Map 的关键细节
- 键的唯一性 :不可变 Map 的键(Key)不能重复,必须保证唯一性,否则创建时会抛出
IllegalArgumentException异常。 Map.of()的参数限制 :直接使用Map.of()方法创建不可变 Map 时,参数个数有上限,最多只能传递 20 个参数(即 10 个键值对) 。当键值对数量超过 10 个时,应使用Map.ofEntries()或Map.copyOf()方法。
六、toArray() 方法的底层原理
toArray() 方法在将集合转换为数组时,会根据集合长度和传入数组的长度进行智能判断:
- 场景一:集合长度 > 数组长度
- 数据在传入的数组中放不下,此时方法会根据集合的实际大小,重新创建一个新的数组来存放数据。
- 场景二:集合长度 ≤ 数组长度
- 数据在传入的数组中放得下,此时方法不会创建新数组,而是直接使用传入的数组来存放数据,从而节省内存开销。