【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

相关推荐
XiYang-DING10 小时前
【LeetCode】144. 二叉树的前序遍历
算法·leetcode·职场和发展
WolfGang00732110 小时前
代码随想录算法训练营 Day28 | 动态规划 part01
算法·动态规划
小碗羊肉10 小时前
【从零开始学Java | 第二十八篇】可变参数
java·开发语言
Java成神之路-10 小时前
Spring AOP 核心进阶:切入点表达式 + 通知类型 + 环绕通知避坑指南(Spring系列8)
java·后端·spring
weitingfu10 小时前
Excel VBA 入门到精通(二):变量、数据类型与运算符
java·大数据·开发语言·学习·microsoft·excel·vba
光电笑映10 小时前
STL 源码解密:unordered 系列容器的底层复用与哈希策略
算法·哈希算法·散列表
6Hzlia10 小时前
【Hot 100 刷题计划】 LeetCode 215. 数组中的第K个最大元素 | C++ 快速选择与堆排序题解
c++·算法·leetcode
小白菜又菜10 小时前
Leetcode 3070. Count Submatrices with Top-Left Element and Sum Less Than k
算法·leetcode·职场和发展
某人辛木10 小时前
Maven一步到位
java·maven
一条咸鱼_SaltyFish11 小时前
DDD 架构重构实践:AI Skills 如何赋能DDD设计与重构
java·人工智能·ai·重构·架构·ddd·领域驱动设计