arrays.aslist 返回的是只读、双向绑定的视图,支持 get、set、contains 等查询与原地修改操作,但不支持 add、remove 等结构性修改;传入基本类型数组会将其整体视为单个元素;需可变集合时须显式拷贝为 arraylist。

Arrays.asList 是 Java 中最常用的数组转 List 工具,但它不是“万能转换器”,而是一个轻量、只读、双向绑定的视图封装。用对了省事高效;用错了,运行时抛 UnsupportedOperationException 是大概率事件。
它能做什么:只读访问 + 原地改值
Arrays.asList 返回的 List 支持以下操作,且性能开销极小(无数据拷贝):
- get(index)、size()、contains(obj)、indexOf(obj) —— 安全查询
- set(index, element) —— 可修改已有位置的值,且会同步更新原始数组
- toArray() —— 返回新数组副本,不影响原数组
例如:String[] arr = {"a", "b"}; List<string> list = Arrays.asList(arr); list.set(0, "x");</string> 后,arr[0] 立即变为 "x"。
它不能做什么:一切结构性修改都报错
任何改变集合大小或结构的操作,都会触发 UnsupportedOperationException:
- add(element)、addAll(collection)
- remove(index)、remove(obj)、clear()
- retainAll()、removeAll()、replaceAll()(JDK 11+)
根本原因:返回的是 java.util.Arrays$ArrayList(非 java.util.ArrayList),它未重写这些方法,直接继承 AbstractList 的默认实现——统一抛异常。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
基本类型数组的“单元素陷阱”
传 int[]、double[] 等原始类型数组时,整个数组被当作一个对象元素处理:
-
Arrays.asList(new int[]{1, 2, 3})→ 得到List<int></int>,大小为 1 -
Arrays.asList(new Integer[]{1, 2, 3})→ 正确,得到List<integer></integer>,大小为 3
Java 8+ 推荐补救方式:Arrays.stream(intArr).boxed().collect(Collectors.toList()),结果是可变 ArrayList。
需要可变集合?必须显式拷贝
只要后续要增删、传给框架 setter、参与流式链式调用,就必须脱离原始数组:
-
最通用写法:
new ArrayList(Arrays.asList(arr))(JDK 7+ 兼容,语义清晰) -
函数式风格:
Arrays.stream(arr).collect(Collectors.toCollection(ArrayList::new)) -
注意避坑:
List.copyOf(Arrays.asList(arr))(Java 10+)仍返回不可变集合,不能直接 add
拷贝有 O(n) 开销,但小数据量(百级以内)几乎无感;若仅临时遍历或只读传参,跳过拷贝更高效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










