Arrays 工具类常用方法

候选人小陈在字节面试时被问到:

"Java 中的 Arrays 工具类,你会用哪些方法?"

小陈说:"排序用 Arrays.sort(),转字符串用 Arrays.toString()。"

面试官点点头:"那你知道 Arrays.sort() 有几种重载吗?分别用在什么场景?二分查找呢?并行排序呢?"

小陈开始支支吾吾...

【面试官心理】 这道题考查的是候选人对 Java 标准库的掌握程度。Arrays 是开发中离不开的工具类,连它有哪些方法都不熟悉,说明写的代码很可能是在重复造轮子。


一、Arrays 工具类概述

java.util.Arrays 是 Java 提供的数组操作工具类,所有方法都是 static 的。

功能分类典型方法
排序sort()
查找binarySearch()
批量赋值fill()
比较equals() / deepEquals()
转字符串toString() / deepToString()
复制copyOf() / copyOfRange()
流操作stream()

二、排序方法 🔴

2.1 基本排序 sort()

int[] arr = {5, 2, 8, 1, 9};
Arrays.sort(arr);
// arr 变成 [1, 2, 5, 8, 9]

2.2 范围排序 sort(a, fromIndex, toIndex)

int[] arr = {5, 2, 8, 1, 9};
Arrays.sort(arr, 1, 4); // 只排序 [2, 8, 1]
// arr 变成 [5, 1, 2, 8, 9]

2.3 自定义排序 sort(T[] a, Comparator<? super T> c)

String[] strs = {"apple", "banana", "cat"};
Arrays.sort(strs, (a, b) -> a.length() - b.length());
// ["cat", "apple", "banana"]

2.4 并行排序 parallelSort()

int[] arr = new int[1000000];
Arrays.parallelSort(arr); // 利用多核 CPU
💡

parallelSort() 适用于大数据量(至少上万个元素),在小数据量上反而可能更慢。


三、二分查找 🔴

int[] arr = {1, 3, 5, 7, 9};
int index = Arrays.binarySearch(arr, 5);  // 2(找到)

int index2 = Arrays.binarySearch(arr, 4);
// 返回负数(没找到,返回 -(插入点) - 1)

二分查找的返回值规则

情况返回值
找到元素元素所在的索引
没找到-(插入点) - 1

四、批量赋值 fill()

int[] arr = new int[5];
Arrays.fill(arr, 100);
// [100, 100, 100, 100, 100]

Arrays.fill(arr, 1, 3, 200); // 范围 [1, 3)
// [100, 200, 200, 100, 100]

五、数组比较 🔴

5.1 equals() vs deepEquals()

int[] a1 = {1, 2, 3};
int[] a2 = {1, 2, 3};
int[][] b1 = {{1, 2}, {3, 4}};
int[][] b2 = {{1, 2}, {3, 4}};

Arrays.equals(a1, a2);       // true
Arrays.deepEquals(b1, b2);  // true(递归比较)

Arrays.equals(b1, b2);      // false(不同对象比较引用)
💡

对于一维数组用 equals(),对于多维数组用 deepEquals()


六、转字符串 🔴

6.1 toString() vs deepToString()

int[] a = {1, 2, 3};
int[][] b = {{1, 2}, {3, 4}};

Arrays.toString(a);     // "[1, 2, 3]"
Arrays.toString(b);     // "[[I@xxx, [I@yyy]" ❌ 多维数组bug

Arrays.deepToString(b);  // "[[1, 2], [3, 4]]" ✅
⚠️

Arrays.toString() 不支持多维数组!必须用 Arrays.deepToString()


七、数组复制 🔴

7.1 copyOf()copyOfRange()

int[] original = {1, 2, 3, 4, 5};

int[] copied = Arrays.copyOf(original, 10);
// [1, 2, 3, 4, 5, 0, 0, 0, 0, 0](自动用0填充)

int[] range = Arrays.copyOfRange(original, 1, 4);
// [2, 3, 4]

八、方法速查表

方法用途
sort()排序
parallelSort()并行排序(大数据量)
binarySearch()二分查找(必须先排序)
fill()批量赋值
equals()浅比较
deepEquals()深比较(多维数组)
toString()转字符串
deepToString()深转字符串(多维数组)
copyOf()复制并扩容
copyOfRange()范围复制
stream()转流

九、面试官追问 🔴

面试官:"Arrays.sort() 用的是什么排序算法?"

标准回答

  • 基础类型(int[]):双轴快速排序(Dual-Pivot Quicksort)
  • 对象类型(Object[]):归并排序(TimSort)——稳定排序

面试官追问:"Arrays.asList() 有什么坑?"

// 坑1:返回的 ArrayList 是固定大小的
List<String> list = Arrays.asList("a", "b");
list.add("c"); // 抛 UnsupportedOperationException

// 坑2:基本类型数组不能直接用
int[] arr = {1, 2, 3};
List<int[]> list = Arrays.asList(arr); // ❌ 编译错误
List<int[]> list = Arrays.asList(1, 2, 3); // ✅ OK