arrays.aslist返回的list不支持增删操作,因底层为arrays.arraylist且共享原数组引用;list.of(java 9+)为真正不可变集合,不接受null,创建后完全不可修改;需可变列表时应直接new arraylist()并用collections.addall或循环填充。

Arrays.asList 返回的 List 不能增删元素
这是最常踩的坑:Arrays.asList 返回的是 Arrays.ArrayList(注意不是 java.util.ArrayList),它底层直接包装原数组,不支持 add、remove、clear 等操作,调用会抛 UnsupportedOperationException。
适用场景仅限于:需要一个“只读视图”快速遍历,或后续立刻转成可变集合。
- 如果只是想遍历或传参给接受
List的方法,Arrays.asList足够轻量 - 如果要往里加新元素、删旧元素,必须包一层:
new ArrayList(Arrays.asList(...)) - 原始数组内容变化会反映在该 List 中(因为是引用共享),这点容易被忽略
List.of 是不可变集合,且不接受 null
List.of(Java 9+)返回的是真正的不可变集合,底层实现更紧凑,内存占用小,但限制也更严格:
- 创建后绝对不能修改 —— 连
set都不支持,报UnsupportedOperationException - 任何元素为
null都会立即抛NullPointerException,不像Arrays.asList可以存null - 适用于配置项、常量列表、函数式编程中作为安全入参
- 性能上比
Arrays.asList略高(无额外包装逻辑),但差异微乎其微,别为此强行升级 JDK
真正需要可变 List?绕开这两个 API 直接 new
如果你明确知道后续要 add/remove,别在 Arrays.asList 或 List.of 上套壳,直接构造更清晰、更少意外:
立即学习“Java免费学习笔记(深入)”;
- 从数组构建可变
ArrayList:new ArrayList(Arrays.asList(arr))—— 两步,但语义清楚 - 更高效一点(尤其大数组):
ArrayList<integer> list = new ArrayList(arr.length); Collections.addAll(list, arr);</integer> - 如果是基本类型数组(如
int[]),Arrays.asList会把它当单个元素(int[]→List<int></int>),必须手动遍历或用IntStream转装箱
性能和兼容性取舍点
没有“绝对高效”,只有“合适场景”:
- JDK 8 项目只能用
Arrays.asList;JDK 9+ 才有List.of,别在低版本硬用 -
Arrays.asList创建快、内存省,但“假可变”陷阱多;List.of创建稍快、更安全,但容错差(null 不行)、不可扩展 - 高频创建短列表(比如每次请求生成几个字符串):优先
List.of,代码干净不易错 - 需复用、后续频繁修改的列表:老老实实
new ArrayList()+ 循环 orCollections.addAll
最麻烦的其实是基本类型数组转换——这一步永远没银弹,得看你是要 List<integer></integer> 还是继续用 int[] 做计算。别指望任何一个 asList 或 of 能自动搞定它。









