java.util.Arrays 与 Collections 工具类
更新时间:2026-09-21。排序比较规则见 Comparable/Comparator,Stream 风格批量处理见 Stream API。
一、Arrays:操作数组
| 方法 | 作用 |
|---|---|
sort(a) / sort(a,cmp) | 排序(基本类型双轴快排,对象 TimSort) |
binarySearch(a,key) | 二分查找,数组必须已排序,否则结果未定义 |
copyOf/copyOfRange | 复制/截断,常用于扩容 |
fill(a,v) | 填充 |
equals/deepEquals | 内容比较(多维用 deep) |
toString/deepToString | 打印(直接 arr.toString() 只有地址) |
asList(T...) | 包装成 List,见下方大坑 |
二、数组 ⇆ List 的转换坑
Arrays.asList 返回 Arrays 内部的定长视图,直接 backed by 原数组:能 set,但 不能 add/remove(UnsupportedOperationException),修改 List 会改数组。
List<Integer> fixed = Arrays.asList(1, 2, 3);
fixed.set(0, 9); // OK
// fixed.add(4); // UnsupportedOperationException
List<Integer> mutable = new ArrayList<>(Arrays.asList(1,2,3)); // 要可变
List<Integer> immutable = List.of(1,2,3); // JDK9+ 不可变基本类型数组有装箱陷阱:Arrays.asList(intArray) 会把整个 int[] 当一个元素得到 List<int[]>。要装箱用 Stream:
List<Integer> list = Arrays.stream(new int[]{1,2,3}).boxed().toList();
Integer[] back = list.toArray(new Integer[0]);
int[] prim = list.stream().mapToInt(Integer::intValue).toArray();三、Collections:操作集合
| 方法 | 作用 |
|---|---|
sort(list) / sort(list,cmp) | 原地排序(List 自带 .sort 更直接) |
reverse/shuffle/swap/rotate | 反转/随机洗牌/交换/旋转 |
max/min/frequency | 极值、计数 |
binarySearch | 有序 List 二分 |
unmodifiableXxx(c) | 返回不可修改视图 |
synchronizedXxx(c) | 包一层同步(现代代码多用 JUC) |
emptyList/Map/Set | 类型安全的空常量 |
singletonList(o) | 单元素不可变集合 |
四、返回空集合别返回 null
查无结果时返回 Collections.emptyList()(或 List.of()),调用方不用做 null 判断,从源头避免 NPE:
public List<Order> query(...) {
return found ? result : Collections.emptyList();
}五、不可变视图 vs 真正不可变
Collections.unmodifiableList(list) 只是包一层只读视图,底层原 List 若还被别处引用并修改,视图内容会跟着变。要真正不可变:JDK10+ List.copyOf(list)(拷贝且不可变),或别再保留原引用。
六、常见坑
- 对 Arrays.asList 结果 add/remove:定长视图,抛 UnsupportedOperationException。
- binarySearch 前忘了 sort:结果错误且不报错。
- 直接打印/比较数组:用 Arrays.toString/equals,多维用 deep 版本。
- int[] 用 asList 想得到
List<Integer>:得到单元素List<int[]>,需 boxed。 - 以为 unmodifiableList 是防御性拷贝:只是视图,源头还能改,要真不可变用 copyOf。
- 空结果返回 null:返回 emptyList 让调用方零判空。
总结
Arrays 提供 sort/binarySearch(必须先排序)/copyOf/fill/equals/toString 等数组操作,打印与内容比较要用 Arrays.toString/equals、多维用 deep 版本;Arrays.asList 返回定长、可 set 不可 add/remove 且与原数组联动的视图,要可变就包一层 ArrayList,且 int[] 不能直接 asList 成 List<Integer>、需 stream boxed;Collections 负责排序反转洗牌与不可变/同步包装,空结果应返回 emptyList 而非 null,unmodifiableList 只是只读视图不是拷贝、真不可变用 List.copyOf。