【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

相关推荐
万亿少女的梦1687 分钟前
基于Spring Boot、Java与MySQL的网络订餐系统设计与实现
java·spring boot·mysql·系统设计·网络订餐
触底反弹9 分钟前
🤯 面试被问 AI Workflow 和 Agent 有啥区别?3 张图 + 2 段代码讲清楚!
人工智能·设计模式·面试
uzong7 小时前
一个好的面试官,应该让候选人感到被尊重
面试
To_OC8 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
咩咩啃树皮8 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
旖-旎9 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
鱟鲥鳚9 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
To_OC9 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
delishcomcn10 小时前
AI视觉识别+分切算法:电化铝缺陷检测与裁切一体化解锁
人工智能·算法
触底反弹10 小时前
深入理解大模型采样:Temperature、Top-K、Top-P 的原理与实战
人工智能·算法·面试