arrays.aslist()返回的是不可变的内部类,不支持add/remove;需new arraylist()转为可变集合;arrays.sort()对基本类型用双轴快排、对象数组用timsort;arrays.equals()逐元素比较,二维数组需deepequals;arrays.fill()引用类型会共享同一实例。

Arrays.asList() 为什么不能直接修改原数组
这个方法返回的不是 ArrayList,而是 Arrays 内部的静态嵌套类 ArrayList(注意:和 java.util.ArrayList 同名但不同类),它底层直接引用传入的数组,不支持 add()、remove() 等结构性修改。
- 调用
list.add("x")会抛出UnsupportedOperationException - 想转成真正可变的集合,得显式新建:
new ArrayList(Arrays.asList(arr)) - 原始数组内容仍可通过
set()修改(因为共享底层数组),但长度固定
Arrays.sort() 对基本类型和对象数组的排序逻辑差异
Arrays.sort() 对 int[] 和 Integer[] 的实现完全不同:前者用双轴快排(Dual-Pivot Quicksort),后者用归并排序(Timsort),且后者要求元素实现 Comparable 或传入 Comparator。
-
Arrays.sort(new int[]{3,1,2})直接生效;但Arrays.sort(new Integer[]{3,1,2}, Comparator.reverseOrder())才能倒序 - 对自定义对象数组排序,必须确保
compareTo()不抛NullPointerException,尤其字段可能为null时 - 多线程环境下,别在排序中修改被排序数组的元素——可能引发
ArrayIndexOutOfBoundsException或结果错乱
Arrays.equals() 和 == 判等的区别与误用场景
== 比较的是数组引用是否相同;Arrays.equals() 才逐个比较元素值。但要注意:它只做一维深度比较,对二维数组要用 Arrays.deepEquals()。
-
int[] a = {1,2}; int[] b = {1,2}; a == b是false,Arrays.equals(a,b)是true -
int[][] x = {{1}}; int[][] y = {{1}};,Arrays.equals(x,y)返回false(比较的是两个子数组的引用) - 如果数组含
null元素,Arrays.equals()能安全处理;但自己手写循环判等时容易漏掉null检查
Arrays.fill() 填充引用类型数组的陷阱
Arrays.fill(objArr, new Object()) 看似填了多个新对象,实际所有位置都指向**同一个对象实例**——后续任意位置修改该对象状态,会影响整个数组。
立即学习“Java免费学习笔记(深入)”;
- 正确做法是用循环分别创建:
for (int i = 0; i - 基本类型数组(如
int[])不受此影响,因为值是拷贝的 - 如果真需要填充相同引用(比如共享配置对象),这是合理用法,但得明确这是设计意图而非疏忽
最常被忽略的是二维数组初始化——Arrays.fill() 只作用于第一层,子数组仍为 null,直接访问 arr[i][j] 会触发 NullPointerException。










