【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

相关推荐
ok_hahaha2 小时前
java从头开始-苍穹外卖-day12-数据统计以及excel报表
java
好家伙VCC2 小时前
# Deno实战:从零搭建一个安全、现代的后端服务在Node.js生态逐渐臃肿
java·python·安全·node.js
littlegirll2 小时前
一个KADB报错分析及实验
java·javascript·数据库
Sunsets_Red2 小时前
模意义下及同余的公式整理
c语言·c++·数学·算法·c#·数论·信息学竞赛
计算机安禾2 小时前
【C语言程序设计】第27篇:递归函数原理与实例分析
c语言·开发语言·数据结构·c++·算法·蓝桥杯·visual studio
常利兵2 小时前
打造Spring Boot接口护盾:防重提交与限流秘籍
java·spring boot·后端
無限進步D2 小时前
C++ 万能头
开发语言·c++·算法·蓝桥杯·竞赛·万能头
Seven972 小时前
JVM排查工具单
java
qq_418101772 小时前
C++中的状态模式
开发语言·c++·算法