List操作add,clear,addall报错UnsupportedOperationException的解决办法

ArrayList和Arrays.ArrayList是两码事

ArrayList

支持 add,clear,addall

Arrays.ArrayList不支持add,clear,addall

这个方法的使用时候,传递的数组必须是对象数组,而不是基本数据类型

JDK源码

/**

*返回由指定数组支持的固定大小的列表。此方法作为基于数组和基于集合的API之间的桥梁,与 Collection.toArray()结合使用。返回的List是可序列化并实现RandomAccess接口。

*/

java 复制代码
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

Arrays.asList()是泛型方法吗,传入的对象必须是对象数组

java 复制代码
int[] myArray = { 1, 2, 3 };
List myList = Arrays.asList(myArray);
System.out.println(myList.size());//1
System.out.println(myList.get(0));//数组地址值
System.out.println(myList.get(1));//报错:ArrayIndexOutOfBoundsException
int [] array=(int[]) myList.get(0);
System.out.println(array[0]);//1

//数组替换为包装类行上述为题不存在

java 复制代码
Integer[] myArray = { 1, 2, 3 };

当传入一个原生的数据类型的数组的时候,Arrays.asList()真正得到的参数就不是数组中的元素,而是数组对象本身!!!此时的List的唯一的元素就是这个数组

对于转化后的集合list,所以使用集合修改方法add(),remove(),clear()会抛异常,因为其底层还是数组,为Arrays的一个内部类,1其并没有实现集合对应的修改类方法会报UnsupportedOperationException。

对于我们开发中的数组转化为ArrayList,有以下方法

1.推荐方法

java 复制代码
List list = new ArrayList<>(Arrays.asList("a", "b", "c"))

2.使用java8的Stream

java 复制代码
Integer [] myArray = { 1, 2, 3 };
List myList = Arrays.stream(myArray).collect(Collectors.toList());
//基本类型也可以实现转换(依赖boxed的装箱操作)
int [] myArray2 = { 1, 2, 3 };
List myList = Arrays.stream(myArray2).boxed().collect(Collectors.toList());

3.使用Guava

对于不可变的集合,可以使用 ImmutableList类以及其of()与copyOf工厂方法

java 复制代码
List<String> il = ImmutableList.of("string", "elements");  // from varargs
List<String> il = ImmutableList.copyOf(aStringArray);      // from array
对于可变集合,可以使用Lists类及其newArrayList()工厂方法

List<String> l1 = Lists.newArrayList(anotherListOrCollection);    // from collection
List<String> l2 = Lists.newArrayList(aStringArray);               // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs

4.使用 Apache Commons Collections

java 复制代码
List<String> list = new ArrayList<String>();
CollectionUtils.addAll(list, str);
相关推荐
聚美智数5 小时前
智能结构化识别-图片结构解析-图像结构化解析-照片结构化解析
android·java·数据库
十年Java程序媛5 小时前
Java枚举Enum完整教程|替代静态常量,开发与面试要点
java·开发语言·spring boot·后端·面试
我是人✓5 小时前
SpringBoot静态资源映射揭秘
java·spring boot·后端
土豆.exe6 小时前
nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配
java·数据库·网络安全·缓存
小坏讲微服务7 小时前
刚发布一个月的JDK 27,为什么我建议你立刻升级?
java·开发语言·spring boot·spring·架构·求职招聘·springboot4
kunicoding7 小时前
多线程编程核心概念详解:从线程基础到并发安全
java·jvm·安全
snow@li7 小时前
SpringBoot:核心注解全景梳理 / @xxx 叫“注解”(Annotation)
java·spring
devilnumber8 小时前
避坑_IDEA 提取方法(Extract Method)工具
java·ide·intellij-idea
鬼手点金8 小时前
Agent 的学习机制:后训练、上下文学习与外部化学习
java·人工智能·git·学习·自动化·nanogpt
小陈不好吃8 小时前
equals 与 hashCode 的契约关系:从 HashMap 到 Lombok 注解
java·hashmap·lombok