Arrays类为原生数组提供安全、标准化、不可变语义的工具方法;Arrays.asList()返回私有ArrayList,不支持增删;基本类型数组传入asList会整体作为单个元素;sort对引用类型要求Comparable或Comparator;equals不适用于嵌套数组,需用deepEquals;所有方法均不支持null数组参数。

Java 的 Arrays 类不是用来“简化数组操作”的万能胶,而是为原生数组提供一组**安全、标准化、不可变语义前提下**的工具方法;直接修改数组内容仍需手动遍历或配合其他类(如 ArrayList)。
为什么 Arrays.asList() 不能增删元素?
它返回的是 Arrays 内部的私有静态类 ArrayList(注意:不是 java.util.ArrayList),该类直接包装传入数组,add()、remove() 等方法会抛出 UnsupportedOperationException。
- 正确用法是将其作为只读视图,或转为可变集合:
String[] arr = {"a", "b"}; Listlist = new ArrayList<>(Arrays.asList(arr)); - 若原数组后续被修改,
Arrays.asList()返回的列表会同步反映变化(因为共享底层数组) - 基本类型数组(如
int[])传入后,整个数组会被当作单个元素塞进列表,结果是List,不是你想要的List
Arrays.sort() 的陷阱:基本类型 vs 引用类型
对基本类型(int[]、double[] 等)直接排序没问题;但对引用类型数组,要求元素实现 Comparable,否则运行时报 ClassCastException。
- 自定义类必须实现
Comparable接口,或显式传入Comparator:Person[] people = {...}; Arrays.sort(people, Comparator.comparing(p -> p.age)); -
Arrays.sort()对对象数组使用的是双轴快排(JDK 7+),但不保证稳定;如需稳定排序,用Arrays.parallelSort()(仅 JDK 8+)或改用Collections.sort()配合Arrays.asList() - 多维数组(如
int[][])只按第一维引用排序,不会递归排序子数组
Arrays.equals() 和 Arrays.deepEquals() 怎么选?
Arrays.equals(a, b) 对一维数组做逐元素比较;对二维及以上数组,它只比较子数组的引用是否相等(即 a[0] == b[0]),几乎总是返回 false。
立即学习“Java免费学习笔记(深入)”;
- 嵌套数组必须用
Arrays.deepEquals(a, b),它会递归调用equals()或deepEquals(),直到基本类型层 - 注意:
deepEquals()对null安全,但若任意元素自身重写的equals()有 bug,结果仍不可靠 - 浮点数比较慎用:即使值相同,
Double.NaN == Double.NaN为false,但Arrays.equals(new double[]{Double.NaN}, new double[]{Double.NaN})返回true(因底层用Double.equals())
真正容易被忽略的是:所有 Arrays 方法都**不支持 null 数组参数**(除 toString(null) 等少数几个外),传入 null 会直接抛 NullPointerException —— 这不是设计疏漏,而是明确告诉你:“数组本身不能为空,这是前提”。










