【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。

相关推荐
weixin_460443563 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
海鸥-w6 小时前
什么是AOP
java
Cc.Y7 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
启观川7 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸7 小时前
排序算法介绍
python·算法·排序算法
paopaokaka_luck7 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_926787057 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev7 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
Sarvartha7 小时前
Lambda 表达式和函数式接口
java·开发语言
计算机毕业设计杰瑞7 小时前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计