Arrays.asList()返回的List不支持增删操作,调用add/remove会抛UnsupportedOperationException;需可变列表应显式new ArrayList(Arrays.asList(arr));基本类型数组传入会导致装箱异常。

Arrays.asList() 转数组为List但不支持增删
这个方法常被误用为“把数组变成可修改的ArrayList”,实际返回的是 Arrays.ArrayList(一个静态内部类),它继承自 AbstractList,但没有重写 add()、remove() 等方法——调用会直接抛 UnsupportedOperationException。
- 适合只读场景:传参给需要
List的 API,比如Collections.binarySearch() - 若需真正可变的
ArrayList,得显式包装:new ArrayList<>(Arrays.asList(arr))
- 注意泛型擦除问题:基本类型数组(如
int[])传入后,整个数组会被当作单个元素,结果是List,不是你想要的List
Arrays.sort() 对基本类型和对象数组行为不同
Arrays.sort() 重载多,但底层策略差异大,直接影响性能和稳定性:
- 对
int[]、double[]等基本类型数组,使用双轴快排(Dual-Pivot Quicksort),平均 O(n log n),最坏 O(n²),但实践中极难触发 - 对对象数组(如
String[]、MyObj[]),默认用 Timsort(归并+插入混合),稳定且最坏也是 O(n log n) - 若对象类没实现
Comparable,又没传Comparator,运行时抛ClassCastException - 多维数组排序只作用于第一维(即按引用排序),不会递归进子数组
Arrays.equals() 和 == 判等逻辑完全不同
新手常拿 == 比较两个数组,结果永远是 false(除非指向同一对象)。Arrays.equals() 才是语义正确的逐元素比较:
- 对基本类型数组:逐个用
==比较值 - 对对象数组:逐个调用
Objects.equals(a, b)(即先判null,再调.equals()) - 注意:它不递归比较嵌套数组,
Arrays.equals(new int[][]{{1}}, new int[][]{{1}})返回false;深层比较得用Arrays.deepEquals() - 多线程下无同步开销,但别在循环里反复调用——自己缓存哈希或用
Arrays.hashCode()预判
Arrays.fill() 只赋值,不扩容也不创建新数组
Arrays.fill() 是原地操作,仅修改已有数组内容,这点必须明确:
立即学习“Java免费学习笔记(深入)”;
- 它不能把
int[] arr = null填成全 0;必须先初始化数组,否则 NPE - 填对象数组时,所有位置都指向同一个引用(比如
Arrays.fill(objArr, new MyObj())后,所有元素是同一实例) - 想填不同对象,得手动循环或用 Stream:
IntStream.range(0, arr.length).forEach(i -> arr[i] = new MyObj());
- 对大数组,
fill()比手写 for 循环略快(JVM 内联优化),但差距微乎其微,不必为此改写逻辑
Arrays 静态方法都不改变数组长度,也不处理 null 元素的自动装箱/拆箱。基本类型数组和包装类数组(如 Integer[])混用时,错误往往出现在类型推断和空指针上,而不是方法本身。










