Arrays.asList() 返回的列表不可结构性修改,因底层是 Arrays 内部类且直接引用原数组;Arrays.equals() 仅浅比较内容,嵌套数组需用 deepEquals()。

Arrays.asList() 为什么不能直接修改原数组
Arrays.asList() 返回的是 Arrays 内部的静态嵌套类 ArrayList(不是 java.util.ArrayList),它底层直接引用传入的数组,不支持 add()、remove() 等结构性修改操作,调用会抛出 UnsupportedOperationException。
- 若需可变列表,应显式转为
new ArrayList(Arrays.asList(...)) - 该方法对基本类型数组(如
int[])无效——它会把整个数组当作一个元素,返回List,而非List - 修改返回列表中的元素(如
set(0, x))会影响原数组,因为是共享引用
Arrays.sort() 对基本类型和对象数组的差异
Arrays.sort() 重载版本行为不同:对 int[]、double[] 等基本类型数组,使用双轴快排(JDK 7+);对对象数组(如 String[]),默认使用 TimSort(稳定排序),且要求元素实现 Comparable 或传入 Comparator。
- 对
Object[]排序时若含null,会抛NullPointerException(除非自定义Comparator显式处理) - 多维数组(如
int[][])调用sort()只按首元素排序,不会递归排序子数组 - 并发修改风险:排序过程中不应在其他线程修改该数组
Arrays.equals() 和 == 到底比什么
Arrays.equals(a, b) 比较两个数组**内容是否相等**(逐元素调用 equals()),而 a == b 只判断是否指向同一内存地址。对基本类型数组,Arrays.equals() 是唯一安全的内容比较方式;对对象数组,它不会递归比较嵌套数组内容。
- 嵌套数组需用
Arrays.deepEquals(),否则[[1,2]]和[[1,2]]会被判为不等(因子数组引用不同) -
Arrays.equals(null, null)返回true;但Arrays.equals(arr, null)返回false,不抛空指针 - 注意:
Arrays.equals()不适用于非数组对象,比如误传List会导致编译错误
Arrays.fill() 的边界与类型陷阱
Arrays.fill() 用于批量赋值,但容易忽略起始/结束索引语义:fill(arr, fromIndex, toIndex, val) 中 toIndex 是**不包含**的,即填充范围为 [fromIndex, toIndex)。此外,基本类型重载版本只接受对应包装类型或原始类型字面量,不能混用。
立即学习“Java免费学习笔记(深入)”;
- 对
boolean[]填1会编译失败;必须填true或false - 对
Object[]填null是合法的,但后续若调用toString()等方法可能触发空指针 - 若
fromIndex > toIndex,方法静默返回,不报错也不填充
Arrays.asList() 的不可变假象和 Arrays.equals() 对嵌套结构的“浅比较”——这两处一旦出错,调试成本远高于改一行代码。









