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(),否则只比较子数组引用 -
Arrays.equals(a, b)会先判null和长度,安全;自己手写循环容易漏空指针 - 注意重载:有针对每种基本类型的版本(
equals(int[], int[])),也有泛型对象版本(equals(Object[], Object[])),别传错类型导致调用到错误重载
Arrays.fill() 填充时注意引用类型陷阱
Arrays.fill() 对基本类型数组直接赋值没问题,但对对象数组(如 String[] 或自定义类数组),它只是把**同一个引用**复制到每个位置。
立即学习“Java免费学习笔记(深入)”;
- 如果填的是可变对象(比如
new StringBuilder()),后续修改任一位置的元素,所有位置都会变 - 要填不同实例?必须用循环:
for (int i = 0; i < arr.length; i++) { arr[i] = new MyObj(); } - 填
null是安全的,因为null是字面量,没有共享问题
Java 数组本身不可变长度,所有“操作”本质都是读、拷贝、替换或封装。工具类方法看似简单,但类型擦除、引用语义、排序稳定性这些点,稍不留意就会在运行时出问题。










