关于Arrays.asList返回的List无法新增和删除?
这个是在写项目的时候发现的,然后就分析了一下源码,得其内部原理
复现代码示例:- public class ArraysAsList {
- public static void main(String[] args) {
- Integer[] array = {1, 2, 3, 4, 5};
- List<Integer> list = Arrays.asList(array);
- list.forEach(System.out::println);
- list.add(11);
- }
- }
复制代码 程序运行至list.add(11)时报错- Exception in thread "main" java.lang.UnsupportedOperationException
复制代码 分析源码:
点击查看Arrays.asList源码,静态的返回 List 的方法
看一下asList里面 new ArrayList的代码实现,就会发现这里的ArrayList并不是java.util.ArrayList中的单列聚集,而是Arrays工具类(java.util.Arrays)中的静态内部类ArrayList
然后回归到Arrays.asList()方法,为什么这个方法生成的List聚集无法在add和remove
因为这里返回的是一个 final 数组,数组自己就是不可变的,所以当调用Arrays.asList方法返回一个聚集后,无法在对这个聚集进行一些利用,这个是数组的特性- private final E[] a;
- ArrayList(E[] array) {
- a = Objects.requireNonNull(array);
- }
复制代码 至于为什么java.util包下的ArrayList的底层也是数组,但是它依然可以去add和remove,那是因为copy了,但是在Arrays下面的ArrayList静态内部类中,它并没有实现add和remove方法用来对聚集进行添加和删除,看下图:
也就是说我们可以调用get方法得到Arrays.asList返回的聚集元素,也可以set修改这里面的值,但是因为它没有add和remove方法所以无法对聚集进行增长和删除,这也是为什么会报错:UnsupportedOperationException(没有支持的方法)的缘故起因。
至此我认为Arrays.asList的问题就讲完了,但是在写这个示例的时候我发现了一个新的知识函数式接口,之前了解过,但是不是很认识。
假如你是为了明白Arrays.asList的问题,那么到这里就可以止步了。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |