Arrays.asList() 返回固定长度列表,不支持增删改;需可变列表应包装为 new ArrayList(Arrays.asList(arr));基本类型数组需先转包装类型。

如何用 Arrays.asList() 安全转换数组为列表
Arrays.asList() 看似方便,但返回的是固定长度的 List 实现(Arrays.ArrayList),不支持 add()、remove()、clear() 等结构性修改操作,调用会直接抛 UnsupportedOperationException。
- 适用场景:仅需遍历、查找、或作为参数传给接受
Collection的方法(如Collections.frequency()) - 若需可变列表,必须显式包装:
new ArrayList(Arrays.asList(arr)) - 对基本类型数组(如
int[])无效——它会把整个数组当做一个元素,结果是List;必须先转成包装类型数组(Integer[])再调用
Arrays.equals() 和 Arrays.deepEquals() 的区别在哪
普通 Arrays.equals(a, b) 对一维数组逐元素比较,对二维及以上数组,只比较子数组引用是否相同;而 Arrays.deepEquals(a, b) 会递归深入每一层,真正做“内容相等”判断。
- 错误用法:
int[][] a = {{1}}; int[][] b = {{1}}; Arrays.equals(a, b)返回false(因两个子数组是不同对象) - 正确做法:用
Arrays.deepEquals(a, b),返回true - 注意:
deepEquals()能处理null和混合维度(如Object[]中混有String和int[][]),但性能略低,非必要不滥用
排序和二分查找必须先保证数组有序吗
Arrays.sort() 自己负责排序,无需前置条件;但 Arrays.binarySearch() 要求目标数组**已升序排列**,否则结果不可预测(不是简单“找不到”,而是可能返回负数以外的错误索引)。
- 常见陷阱:对未排序数组调用
binarySearch(),偶尔回返回“巧合”的正数,误以为查到了 - 若不确定是否有序,必须先
sort()再binarySearch();或改用Stream+filter()(适合小数据量) - 注意:
sort()对对象数组要求元素实现Comparable或传入Comparator;基本类型数组则无此限制
Arrays.fill() 和 Arrays.setAll() 该怎么选
Arrays.fill() 是静态赋值——所有位置设为同一个值;Arrays.setAll() 接受一个 IntUnaryOperator,允许按索引动态计算每个位置的值。
立即学习“Java免费学习笔记(深入)”;
- 填常量用
fill():简洁高效,如Arrays.fill(arr, -1) - 填规律值用
setAll():比如初始化为下标本身Arrays.setAll(arr, i -> i),或平方值i -> i * i - 注意:两者都不支持基本类型数组的“对象化填充”(如把
int[]填成Integer对象),它们操作的始终是数组声明的原始类型
多维数组的深度操作、并发安全、以及和 Stream 的互操作,往往需要组合多个工具方法,而不是依赖单一 API。真正容易出错的,是默认假设“数组转列表就可修改”或“二维数组 equals 就是内容相等”这类隐含前提。









