arrays.aslist返回的是固定大小的list视图,支持get、set、size等操作且set会修改原数组,但add、remove、clear等结构修改操作均抛unsupportedoperationexception;需增删时应转为new arraylist(arrays.aslist(arr))。

Arrays.asList返回的列表能做什么
它不是java.util.ArrayList,而是Arrays内部的固定大小List视图,底层直接引用原始数组。这意味着:
- 可以安全调用
get()、set()、size()、contains()、indexOf()等方法 -
set(i, x)会实时修改原数组对应位置的值,双向可见 - 支持迭代器遍历、
toArray()、stream()等不改变结构的操作
哪些操作会直接报错
所有试图改变列表长度或结构的操作都会抛出UnsupportedOperationException:
-
add()、addAll()、remove()、removeAll() -
clear()、retainAll() - 调用迭代器的
remove()方法也会失败
需要增删时怎么安全转换
如果后续逻辑涉及添加、删除或动态调整,必须创建独立可变副本:
- 推荐写法:
new ArrayList(Arrays.asList(arr)) - 其他可行方式:
new LinkedList(Arrays.asList(arr))或 Java 8+ 的Arrays.stream(arr).collect(Collectors.toList()) - 注意避开陷阱:
List.copyOf()(Java 10+)返回不可变集合,同样不支持修改
容易被忽略的关键细节
几个实际开发中常踩的坑:
- 传入
null数组会直接抛NullPointerException,不是返回空列表 - 基本类型数组(如
int[])会被整体当作单个元素,导致size() == 1;应改用Integer[]或Stream转换 - 即使只读使用,也建议用
Collections.unmodifiableList()封装,避免误调用修改方法











