一、Arrays.asList() 返回的是一个“基于原数组的固定大小 List”,它不允许改变元素数量。
List<String> list = Arrays.asList("a", "b");
list.add("c"); // 直接抛异常
所以:
- ❌
add - ❌
remove - ❌
clear
都会直接抛 UnsupportedOperationException
二、Arrays.asList() 不是“创建集合”,而是“给数组套了个 List 外壳”。外壳不能改变数组的命运。
三、Collections.singleton()也是如此,- 返回的是不可变集合,修改操作 → 直接抛异常
Set<String> s = Collections.singleton("user:view");
s.add("x"); // 也会抛 UnsupportedOperationException
四、为什么 Java 还要设计这种“半残 List”?
因为 Java 需要一种把数组当 List 用,但又不拷贝、不浪费、不撒谎的方式。
比如有个需求
“我有一个数组,我想把它当 List 传给别的方法用。”
有以下几种解决方法
-
每次都 new ArrayList(全拷贝)
List<T> list = new ArrayList<>(Arrays.asList(arr));这样会导致性能差(拷贝数组)、内存多一份;
-
禁止数组 → List 的直接转换,开发者只能自己写 for 循环 或 到处 new 集合,API 极不友好,违背 Java “易用性”原则
所以jdk选择了数组的 List 视图方案,不进行拷贝,并且快速,但是缺点是不允许改变大小。