JAVA_基础_Arrays.asList()

19 阅读1分钟

一、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 传给别的方法用。”

有以下几种解决方法

  1. 每次都 new ArrayList(全拷贝)

     List<T> list = new ArrayList<>(Arrays.asList(arr));
    

    这样会导致性能差(拷贝数组)、内存多一份;

  2. 禁止数组 → List 的直接转换,开发者只能自己写 for 循环 或 到处 new 集合,API 极不友好,违背 Java “易用性”原则

所以jdk选择了数组的 List 视图方案,不进行拷贝,并且快速,但是缺点是不允许改变大小。