java.util.Arrays是一个专门操作数组的工具类,里面全是静态方法,主要功能包括:排序、查找、复制、填充、比较、打印/转字符串、转 List 等。用法就是:Arrays.方法名(数组)。
一、基本前提:导入包
java
import java.util.Arrays;
二、常用功能速查表
| 功能 | 方法示例(只列常用) | 作用简述 |
|---|---|---|
| 排序 | Arrays.sort(arr) |
升序排序(基本类型、对象数组) |
| 二分查找 | Arrays.binarySearch(arr, key) |
在已排序数组中查找元素,返回索引 |
| 填充 | Arrays.fill(arr, val) |
将数组所有元素设为 val |
| 复制数组 | Arrays.copyOf(arr, newLength) |
复制并指定新长度,多退少补 |
| 复制范围 | Arrays.copyOfRange(arr, from, to) |
复制指定范围 |
| 比较(一维) | Arrays.equals(arr1, arr2) |
比较两个数组内容是否相等 |
| 比较(多维) | Arrays.deepEquals(arr1, arr2) |
深度比较多维数组内容 |
| 转字符串 | Arrays.toString(arr) |
得到 [1, 2, 3] 这样的字符串 |
| 多维转字符串 | Arrays.deepToString(arr) |
多维数组"漂亮打印" |
| 数组转 List | Arrays.asList(T... a) |
数组转固定大小的 List |
| 字典序比较 | Arrays.compare(arr1, arr2) |
按字典序比较两个数组(JDK 9+) |
| 找第一个差异 | Arrays.mismatch(arr1, arr2) |
返回第一个不匹配元素的下标(JDK 9+) |
2.1 排序:Arrays.sort
1.基本类型数组排序
java
int[] nums = {5, 2, 9, 1, 5};
Arrays.sort(nums);
System.out.println(Arrays.toString(nums)); // 排序后:[1, 2, 5, 5, 9]
2.对象数组(String、Integer 等)排序
java
String[] names = {"Tom", "alice", "Bob"};
Arrays.sort(names); // 默认按字典序(ASCII),大写在前
System.out.println(Arrays.toString(names)); // [Bob, Tom, alice]
// 忽略大小写排序
Arrays.sort(names, String.CASE_INSENSITIVE_ORDER);
// 或:Arrays.sort(names, (a, b) -> a.compareToIgnoreCase(b));
System.out.println(Arrays.toString(names)); // [alice, Bob, Tom]
自定义对象需要实现Comparable或单独传Comparator:
java
class User {
String name;
int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
User[] users = {new User("A", 20), new User("B", 18)};
// 按 age 升序
Arrays.sort(users, Comparator.comparingInt(u -> u.age));
System.out.println(Arrays.toString(users)); // [User{name='B', age=18}, User{name='A', age=20}]
// 按 age 降序
Arrays.sort(users, (u1, u2) -> u2.age - u1.age);
System.out.println(Arrays.toString(users)); // [User{name='A', age=20}, User{name='B', age=18}]
2.2 查找:Arrays.binarySearch
前提:数组必须已经有序,否则结果不确定。
java
int[] arr = {1, 3, 5, 7, 9};
int key = 6;
int idx = Arrays.binarySearch(arr, key);
if (idx >= 0) {
System.out.println("找到,下标 = " + idx);
} else {
System.out.println("未找到,插入点 = " + (-idx - 1)); // 未找到,插入点 = 3
}
- 找到:返回 ≥ 0 的下标。
- 找不到:返回
-(返回值) - 1,插入点是第一个大于 key 的元素下标,如果都小于 key 则为 arr.length。
2.3 填充:Arrays.fill
java
int[] arr = new int[5];
Arrays.fill(arr, 7); // 全部填 7
System.out.println(Arrays.toString(arr)); // [7, 7, 7, 7, 7]
// 只填充一部分 [from, to)
Arrays.fill(arr, 1, 4, 0);
System.out.println(Arrays.toString(arr)); // [7, 0, 0, 0, 7]
2.4 复制:Arrays.copyOf / copyOfRange
1.copyOf:整体复制并指定新长度
java
int[] src = {1, 2, 3};
int[] dest = Arrays.copyOf(src, 5); // 新长度为 5,多余位补 0
System.out.println(Arrays.toString(dest)); // [1, 2, 3, 0, 0]
- 新长度 > 原长度:末尾补默认值(0 / false / null)。
- 新长度 < 原长度:截断。
2.copyOfRange:复制一段范围
java
int[] src = {10, 20, 30, 40, 50};
int[] sub = Arrays.copyOfRange(src, 1, 4); // 复制 [1, 4)
System.out.println(Arrays.toString(sub)); // [20, 30, 40]
2.5 比较:equals / deepEquals
1.一维数组:Arrays.equals
比较的是元素内容,不是==引用。
java
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
int[] c = {1, 2, 4};
System.out.println(Arrays.equals(a, b)); // true
System.out.println(Arrays.equals(a, c)); // false
2.多维数组:Arrays.deepEquals
java
int[][] a1 = {{1, 2}, {3, 4}};
int[][] a2 = {{1, 2}, {3, 4}};
int[][] a3 = {{1, 2}, {3, 5}};
System.out.println(Arrays.deepEquals(a1, a2)); // true
System.out.println(Arrays.deepEquals(a1, a3)); // false
2.6 打印(转字符串):toString / deepToString
1.一维数组:Arrays.toString
java
int[] arr = {1, 2, 3};
System.out.println(Arrays.toString(arr)); // [1, 2, 3]
2.多维数组:Arrays.deepToString
java
int[][] arr = {{1, 2}, {3, 4}};
System.out.println(Arrays.deepToString(arr)); // [[1, 2], [3, 4]]
2.7 数组转 List:Arrays.asList
java
String[] strs = {"A", "B", "C"};
List<String> list = Arrays.asList(strs);
System.out.println(list); // [A, B, C]
// list.add("D"); // 会抛出 UnsupportedOperationException
list.set(0, "a");
System.out.println(list); // 可以修改元素,但结构不可变:[a, B, C]
- 返回的是固定大小的 List,不能增删元素,但可以修改已有元素。
2.8 字典序比较与差异点(JDK 9+ 提供)
1.compare:字典序比较
java
int[] a = {1, 2, 3};
int[] b = {1, 2, 4};
int cmp = Arrays.compare(a, b);
if (cmp < 0) {
System.out.println("a < b");
} else if (cmp > 0) {
System.out.println("a > b");
} else {
System.out.println("a == b");
}
2.mismatch:找第一个不匹配元素下标
java
int[] a = {1, 2, 3, 4};
int[] b = {1, 2, 0, 4};
int idx = Arrays.mismatch(a, b);
if (idx >= 0) {
System.out.println("第一个不同的下标 = " + idx); // 这里是 2
} else {
System.out.println("数组完全相同");
}
三、算法刷题 / 面试高频(Top 5)
在刷题时,我们最需要的是快速排序、初始化数组和调试输出。
| 排名 | 方法 | 一句话作用 | 代码示例 | 刷题常见用途 |
|---|---|---|---|---|
| 1 | sort() |
数组排序(升序) | Arrays.sort(arr); | 排序题、二分查找前预处理 |
| 2 | toString() |
打印数组内容 | System.out.println(Arrays.toString(arr)); | 调试时快速查看数组元素 |
| 3 | fill() |
批量初始化 | Arrays.fill(arr, -1); | 初始化访问数组、距离数组 |
| 4 | binarySearch() |
二分查找 | int idx = Arrays.binarySearch(arr, 5); | 在有序数组中快速找目标值 |
| 5 | copyOf() |
扩容或截断 | int[] newArr = Arrays.copyOf(arr, 10) | 动态数组扩容、备份数组 |
四、日常业务开发(Top 3)
在写业务代码时,更多是做数据转换和比较。
| 排名 | 方法 | 一句话作用 | 代码示例 | 开发常见用途 |
|---|---|---|---|---|
| 6 | asList() |
数组转List | List list = Arrays.asList("a", "b"); | 快速将固定数据转为集合处理 |
| 7 | equals() |
比较内容 | boolean isSame = Arrays.equals(arr1, arr2); | 判断两个数组内容是否一致 |
| 8 | copyOfRange() |
截取子数组 | int[] sub = Arrays.copyOfRange(arr, 1, 4); | 分页、截取部分数据 |
五、必须注意的"避坑指南"(重要!)
很多人用Arrays类容易踩这几个坑,请务必记下来:
1.asList()返回的 List 不能增删!
java
String[] arr = {"A", "B"};
List<String> list = Arrays.asList(arr);
// list.add("C"); // ❌ 运行报错!UnsupportedOperationException
// list.remove(0); // ❌ 运行报错!
list.set(0, "a"); // ✅ 可以修改元素
解决方法:如果你需要一个能增删的 List,这样写:
java
List<String> realList = new ArrayList<>(Arrays.asList(arr));
2.binarySearch()前必须先排序!
如果数组是无序的,使用二分查找返回的结果是不确定的。一定要先sort()再search()。
3.多维数组要用deepToString
java
int[][] matrix = {{1, 2}, {3, 4}};
System.out.println(Arrays.toString(matrix)); // ❌ 打印的是地址 [[I@...]
System.out.println(Arrays.deepToString(matrix)); // ✅ 打印内容 [[1, 2], [3, 4]]
记忆口诀
为了方便记忆,编了个顺口溜:
排序查找用
sortsearch,打印调试
toString。填充复制
fillcopy,转 List 找
asList。