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

二、数组相等判断

  1. Arrays.equals():推荐使用,逐个元素对比内容是否一致;
  2. 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 是数组开发高频工具类,记住几个关键点:

  1. 复制:copyOf/copyOfRange;填充:fill/setAll
  2. 判等优先equals,慎用 hashCode 单独判等;
  3. 二分查找binarySearch必须先排序;
  4. 调试打印固定用toString

Tags:

发表回复

Your email address will not be published. Required fields are marked *.

*
*