【java】Arrays工具类详解
·
Java 中的 Arrays 工具类详解
在 Java 开发中,数组是最基础的数据结构之一。
但你是否遇到过这些问题:
- 两个数组明明内容一样,
equals()却返回 false? - 打印数组直接输出
[I@1b6d3586? - 多维数组比较总是出问题?
- 数组排序后想用二分查找却查不到?
如果有,那么你可能对 Arrays 这个工具类还不够熟悉。
一、Arrays 是什么?
Arrays 是 Java 提供的一个 数组操作工具类,位于:
java.util.Arrays
它是一个:
- 全部由
static方法组成 - 专门用于数组操作
- 不可实例化的工具类
也就是说,我们不需要 new Arrays(),直接使用:
Arrays.sort(arr);
二、为什么需要 Arrays?
数组本身是一个对象,但:
- 不能直接比较内容
- 没有排序方法
- 不能直接打印内容
- 没有方便的查找能力
例如:
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(a.equals(b)); // false
为什么是 false?
因为数组的 equals() 继承自 Object,比较的是 地址。
👉 Arrays 的出现就是为了解决这些问题。
三、Arrays 的基础使用
1️⃣ Arrays.equals() —— 比较数组内容
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(Arrays.equals(a, b)); // true
适用于:
- 基本类型数组
- 对象数组
⚠️ 但只适用于“一维数组”
2️⃣ Arrays.deepEquals() —— 多维数组比较
int[][] a = {{1,2},{3,4}};
int[][] b = {{1,2},{3,4}};
System.out.println(Arrays.deepEquals(a, b)); // true
区别:
| 方法 | 适用 |
|---|---|
| equals | 一维数组 |
| deepEquals | 多维数组 |
3️⃣ Arrays.toString() —— 打印数组
如果直接打印数组:
System.out.println(arr);
输出类似:
[I@1b6d3586
正确做法:
System.out.println(Arrays.toString(arr));
多维数组:
Arrays.deepToString(arr);
4️⃣ Arrays.sort() —— 排序
int[] arr = {5, 2, 8, 1};
Arrays.sort(arr);
排序规则:
- 基本类型:升序
- 对象类型:根据 Comparable
- 可自定义 Comparator
示例:
String[] arr = {"b", "a", "c"};
Arrays.sort(arr);
自定义排序:
Arrays.sort(arr, (a, b) -> b.compareTo(a));
5️⃣ Arrays.binarySearch() —— 二分查找
int index = Arrays.binarySearch(arr, 5);
⚠️ 重要前提:
必须是已经排序的数组!
否则结果不正确。
6️⃣ Arrays.fill() —— 填充数组
int[] arr = new int[5];
Arrays.fill(arr, 10);
也可以指定区间:
Arrays.fill(arr, 1, 3, 100);
7️⃣ Arrays.copyOf() —— 数组扩容
int[] original = {1, 2, 3, 4, 5};
int[] copy = Arrays.copyOf(original, original.length);
// 也可以指定新长度
int[] longerCopy = Arrays.copyOf(original, 10); // 后5位补0
int[] shorterCopy = Arrays.copyOf(original, 3); // 只复制前3个元素
作用:
- 扩容
- 截断
- 克隆
四、进阶方法(JDK 8 之后)
1️⃣ Arrays.parallelSort()
JDK 8 引入的并行排序:
Arrays.parallelSort(arr);
适用于:
- 大数据量数组
- 多核 CPU
底层基于 ForkJoin。
2️⃣ Arrays.stream()
将数组转为 Stream:
Arrays.stream(arr)
.filter(x -> x > 5)
.forEach(System.out::println);
这是函数式编程常用方式。
3️⃣ Arrays.asList()
List<String> list = Arrays.asList("a", "b", "c");
⚠️ 重要特点:
- 返回的是固定长度 List
- 不可 add/remove
五、典型使用场景
场景 1:参数校验
if (!Arrays.equals(input, expected)) {
throw new IllegalArgumentException();
}
场景 2:单元测试断言
assertTrue(Arrays.equals(result, expected));
场景 3:快速初始化测试数据
int[] arr = new int[100];
Arrays.fill(arr, -1);
场景 4:集合转换
List<String> list = Arrays.asList(arr);
六、易错点总结(高频面试 )
❌ 1. equals 比较的是地址
a.equals(b); // 错
Arrays.equals(a, b); // 对
❌ 2. binarySearch 未排序
Arrays.binarySearch(new int[]{3,1,2}, 2);
结果不可预期。
❌ 3. asList 不能 add
List<String> list = Arrays.asList("a", "b");
list.add("c"); // 抛异常
原因:
Arrays.asList()返回的是一个固定大小的列表,其内部是对原始数组的包装。它不支持修改其大小的操作(如 add()或 remove()),但支持修改元素值(set()方法)
解决:
new ArrayList<>(Arrays.asList("a", "b"));
❌ 4. 多维数组使用 equals
Arrays.equals(a, b); // false
应使用:
Arrays.deepEquals(a, b);
❌ 5. copyOf 是浅拷贝(对象数组)
Person[] newArr = Arrays.copyOf(oldArr, oldArr.length);
只是复制引用。
七、Arrays 与 Collections 的关系
| 对比点 | Arrays | Collections |
|---|---|---|
| 作用对象 | 数组 | 集合 |
| 是否可扩容 | 否 | 是 |
| 是否支持泛型 | 有限 | 完整支持 |
| 常用场景 | 性能敏感场景 | 业务开发 |
八、总结
Arrays 是 Java 最常用的工具类之一,但很多人只会:
Arrays.sort()
真正高频使用的还有:
- equals
- deepEquals
- toString
- binarySearch
- fill
- copyOf
- stream
- asList
更多推荐




所有评论(0)