今天在对list数组进行add或remove操作时抛出了java.lang.UnsupportedOperationException异常
发现是使用了Arrays工具类的asList方法将数组直接转成List后使用了add()或remove()方法。
原因?
我们先看一下Arrays.asList方法的源码。
此方法return了一个ArrayList感觉没有问题,但是查看这个ArrayList发现它不是我们熟知的java.util.ArrayList。它是java.util.Arrays.ArrayList。
它是Arrays自己定义的一个静态内部类,这个内部类没有实现add()和remove()方法,所以是直接使用的父类AbstractList的相应方法。
然而AbstractList类里的这两个方法是直接抛出java.lang.UnsupportedOperationException异常的
扩展
String[] arr = new String[]{"Hello","World"};
List list = Arrays.asList(arr);
//1.运行抛出异常
list.add("JavaSE");
//2.list.get(0);会随着操作数组而同步被修改
arr[0] = "Halo";
结论
所以Arrays.asList返回的java.util.Arrays.ArrayList适合用来遍历保存数据。不适合进行插入删除操作。如果还需要进行增删操作还是new一个java.util.ArrayList来使用吧。
Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。