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
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐