Arrays.asList()返回不可变视图,仅支持读写元素但不支持增删;需可变List时应包装为ArrayList或用Collections.addAll()预分配初始化;基本类型数组须通过Stream或手动转换。

Arrays.asList() 本身不创建可变 List,它只是数组的视图;真正需要增删操作时,必须用 ArrayList 构造器包装——这不是“多此一举”,而是明确分离读取与修改语义的关键设计。
Arrays.asList() 适合只读场景
它返回的是 java.util.Arrays.ArrayList(内部静态类),不是 java.util.ArrayList。这个类支持 get()、set()、contains(),但所有结构性修改方法(如 add()、remove()、clear())都会抛 UnsupportedOperationException。
- 原数组与该 List 共享底层数据:改 List 的某个元素,原数组对应位置也会变
- 适用于配置项加载、参数校验、批量查询等无需增删的场合
- 零拷贝、内存友好,性能最优
new ArrayList(Arrays.asList()) 是最常用可变方案
这行代码本质是两步:先用 Arrays.asList() 快速构建视图,再由 ArrayList 构造器完成元素复制,生成独立、可修改的实例。
- 支持
add()、remove()、addAll()等全部操作 - 适用于中小规模数据(几百到几千元素),代码简洁、可读性强
- 注意:若原数组含
null,新 List 中也会保留null
Collections.addAll() 更适合大批量初始化
当已知数组很大,且后续要频繁增删时,直接预分配容量 + 批量添加比构造器更高效:
立即学习“Java免费学习笔记(深入)”;
List<string> list = new ArrayList(array.length);</string>Collections.addAll(list, array);- 避免了中间 List 视图对象的创建,也绕过了
Arrays.asList()的不可变限制 - 在百万级元素初始化场景中,GC 压力和执行耗时明显更低
基本类型数组需额外处理
像 int[] 这类无法直接用 Arrays.asList()(会把整个数组当成一个 Object 元素)。正确做法是:
- 用 Stream:
Arrays.stream(intArray).boxed().collect(Collectors.toList()) - 或手动遍历填充(对性能极致敏感时)
- 避免误写
Arrays.asList(intArray)—— 结果是List<int></int>,不是预期的List<integer></integer>

















