【Java】Arrays 工具类全解
哈喽大家好,我是云扬。日常开发中数组操作十分频繁,Java 提供了java.util.Arrays工具类,封装了数组复制、排序、查找、类型转换等常用方法,不用自己重复造轮子。今天系统梳理一遍 Arrays 常用 API,附上实操代码,方便日后查阅。
一、数组创建与填充
1. copyOf:数组拷贝,可扩容 / 截断
copyOf(原数组,新长度),长度大于原数组自动补默认值,小于原数组做截断。
import java.util.Arrays;
public class ArraysDemo {
public static void main(String[] args) {
int[] arr = {1,2,3,4};
// 截断数组,只保留前2位
int[] arr1 = Arrays.copyOf(arr,2);
// 扩容数组,多出位置补int默认值0
int[] arr2 = Arrays.copyOf(arr,6);
System.out.println(Arrays.toString(arr1)); // [1, 2]
System.out.println(Arrays.toString(arr2)); // [1, 2, 3, 4, 0, 0]
}
}
2. copyOfRange:区间范围拷贝
左闭右开[from,to),截取指定下标区间生成新数组。
int[] arr = {10,20,30,40,50};
// 下标1~3,取20、30
int[] rangeArr = Arrays.copyOfRange(arr,1,3);
System.out.println(Arrays.toString(rangeArr)); // [20, 30]
3. fill:批量填充数组元素
统一给数组全部 / 指定区间赋值。
int[] fillArr = new int[5];
Arrays.fill(fillArr,9); // 全部填充9
System.out.println(Arrays.toString(fillArr)); // [9, 9, 9, 9, 9]
Arrays.fill(fillArr,1,3,5); // 下标1、2填充5
System.out.println(Arrays.toString(fillArr)); // [9, 5, 5, 9, 9]
二、数组相等判断
Arrays.equals():推荐使用,逐个元素对比内容是否一致;hashCode()基于数组内容生成哈希值,但存在哈希碰撞,不能单独用来判定相等,仅可做快速预校验。
int[] a = {1,2,3};
int[] b = {1,2,3};
int[] c = {1,3,2};
System.out.println(Arrays.equals(a,b)); // true
System.out.println(Arrays.equals(a,c)); // false
System.out.println(Arrays.hashCode(a));
System.out.println(Arrays.hashCode(b));
小贴士:只有 equals 返回 true,数组内容才一定相同;hashCode 相同,数组未必相等。
三、数组排序 sort ()
Arrays.sort 支持基本数据类型、对象数组排序,基本类型采用双轴快速排序。
int[] sortArr = {5,1,9,3,2};
Arrays.sort(sortArr);
System.out.println(Arrays.toString(sortArr)); // [1, 2, 3, 5, 9]
四、二分查找 binarySearch ()
⚠️前提:数组必须提前升序排序,否则结果不可靠,找到返回下标,找不到返回负数。
int[] searchArr = {1,2,3,4,5,6};
int index = Arrays.binarySearch(searchArr,4);
System.out.println(index); // 3
int noFind = Arrays.binarySearch(searchArr,9);
System.out.println(noFind); // 负数
五、数组流转 Stream
Arrays.stream()将数组转为流,借助 Stream 流式编程做过滤、求和等操作。
int[] streamArr = {1,2,3,4,5};
// 求和
int sum = Arrays.stream(streamArr).sum();
// 筛选大于3的元素
Arrays.stream(streamArr).filter(num -> num>3).forEach(System.out::print);
System.out.println("\n总和:"+sum);
六、数组打印 toString ()
直接打印数组变量输出地址哈希值,Arrays.toString格式化输出数组内容,开发调试必备。
int[] printArr = {11,22,33};
System.out.println(printArr); // [I@xxxx 内存地址
System.out.println(Arrays.toString(printArr)); // [11, 22, 33]
七、数组转 List asList ()
将包装类数组转为 List 集合,注意:基本类型数组直接转 List 会把整个数组当成单个元素。
// 正确写法:Integer包装类数组
Integer[] listArr = {1,2,3,4};
java.util.List<Integer> list = Arrays.asList(listArr);
System.out.println(list);
八、函数式填充 setAll
Java8 新增,通过函数表达式动态赋值数组元素。
int[] funcArr = new int[5];
// 下标值*2赋值
Arrays.setAll(funcArr,i->i*2);
System.out.println(Arrays.toString(funcArr)); // [0, 2, 4, 6, 8]
九、parallelPrefix 并行累积运算
并行遍历数组,当前元素 = 当前值和前一位元素运算结果,覆盖原值。
int[] preArr = {1,2,3,4};
// 累加:1,1+2=3,3+3=6,6+4=10
Arrays.parallelPrefix(preArr,(x,y)->x+y);
System.out.println(Arrays.toString(preArr)); // [1, 3, 6, 10]
总结
Arrays 是数组开发高频工具类,记住几个关键点:
- 复制:
copyOf/copyOfRange;填充:fill/setAll; - 判等优先
equals,慎用 hashCode 单独判等; - 二分查找
binarySearch必须先排序; - 调试打印固定用
toString。



