【Java】Arrays工具类——数组操作终极指南

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]]

记忆口诀

为了方便记忆,编了个顺口溜:

排序查找用 sort search

打印调试 toString

填充复制 fill copy

转 List 找 asList

相关推荐
春日见3 分钟前
决策规划控制面经汇总
人工智能·深度学习·算法·机器学习·自动驾驶
Full Stack Developme4 分钟前
Java DFA算法
java·python·算法
fie888913 分钟前
LBP + HOG 特征检测与识别 MATLAB 实现
数据结构·算法·matlab
Yukinaaaa14 分钟前
以“轮盘数组”思维彻底搞懂并实现阻塞队列
java·服务器·ide·安全·javaee·阻塞队列·轮盘数组
海天鹰16 分钟前
图片去黑边算法
qt·算法
2301_8008951017 分钟前
线性代数保研面试复习
线性代数·面试·保研
夕除24 分钟前
AOP 实现 Redis 缓存切面解析
java·开发语言·python
库拉大叔25 分钟前
工具调用效率对比实测:GPT-5.5与Gemini 3.5 Flash性能评估
java·前端·人工智能
我是唐青枫29 分钟前
Java MyBatis 实战指南:XML 映射、动态 SQL 与数据访问层设计
java·mybatis
摇滚侠32 分钟前
Spring 零基础入门到进阶 面向切面 AOP 52-60
java·后端·spring