Java里Arrays工具类有哪些常用方法_Java数组操作技巧说明

Arrays.asList()返回的List不支持增删操作,需包装为ArrayList;基本类型数组会因泛型擦除导致类型错误;Arrays.sort()对基本类型用不稳定快排、对象数组用稳定TimSort;Arrays.equals()逐元素比较值,多维数组需deepEquals();Arrays.fill()对引用类型仅复制同一对象引用。

Arrays.asList() 转集合但别直接改大小

这个方法常被用来快速把数组变成 List,但返回的是 Arrays$ArrayList(不是 java.util.ArrayList),它底层封装了原数组,不支持 add()remove() 等修改结构的操作,调用会抛 UnsupportedOperationException

  • 适合只读场景:遍历、查找、contains()
  • 真要增删,请包一层:new ArrayList(Arrays.asList(arr))
  • 注意泛型擦除问题:基本类型数组(如 int[])传入会变成 List,不是你想要的 List;得先手动装箱或改用 Integer[]

Arrays.sort() 的重载差异和稳定性

Arrays.sort() 对不同输入行为不同:对基本类型数组(int[]double[])用双轴快排(不稳定),对对象数组(String[]MyObj[])用 TimSort(稳定)。

  • 排序前务必确认元素是否为 null:对象数组含 null 且没自定义 Comparator,会抛 NullPointerException
  • 自定义排序推荐用 lambda:Arrays.sort(strs, (a, b) -> b.length() - a.length())
  • 想降序又不想写 Comparator?对包装类型可先升序再 Collections.reverse(),但注意:这不适用于基本类型数组

Arrays.equals() 和 == 的本质区别

数组变量是引用,== 比的是内存地址,两个内容相同但不同对象的数组,== 返回 false;而 Arrays.equals() 才真正逐元素比较值。

  • 多维数组要用 Arrays.deepEquals(),否则只比较子数组引用
  • Array

    s.equals(a, b)
    会先判 null 和长度,安全;自己手写循环容易漏空指针
  • 注意重载:有针对每种基本类型的版本(equals(int[], int[])),也有泛型对象版本(equals(Object[], Object[])),别传错类型导致调用到错误重载

Arrays.fill() 填充时注意引用类型陷阱

Arrays.fill() 对基本类型数组直接赋值没问题,但对对象数组(如 String[] 或自定义类数组),它只是把**同一个引用**复制到每个位置。

  • 如果填的是可变对象(比如 new StringBuilder()),后续修改任一位置的元素,所有位置都会变
  • 要填不同实例?必须用循环:
    for (int i = 0; i < arr.length; i++) {
        arr[i] = new MyObj();
    }
  • null 是安全的,因为 null 是字面量,没有共享问题

Java 数组本身不可变长度,所有“操作”本质都是读、拷贝、替换或封装。工具类方法看似简单,但类型擦除、引用语义、排序稳定性这些点,稍不留意就会在运行时出问题。