Arrays.asList()生成的List抛UnsupportedOperationException分析
一.背景:使用工具类 Arrays.asList()把数组转换成集合时,使用其修改集合相关的方
法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。

二.分析:既然是List为何不能进行增删改的操作?
1.Arrays.asList(str)调用的是Arrays类中的asList方法,该方法返回一个ArrayList对象。

2.进入asList方法发现这个ArrayList是Arrays的一个继承AbstractList的静态内部类,根本不是java.util下的ArrayList.也并没有提供add,remove,clear方法。

3.其实Arrays$ArraysList调用add调用的是父类AbstractList中的方法add(E e)

4.父类AbstractList最终调用add(int index,E element),即抛出异常。

5.再看下java.util下的ArrayList,ArrayList跟Arrays$ArrayList同样都继承AbstractList

6.再看下java.util下的ArrayList为啥不会报错呢?因为java.util.ArrayList覆盖了父类中的add方法。所以不会报错

三:总结
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> AbstractList是一个List抽象类,继承AbstractCollection,实现List接口,Arrays$ArrayList和java.util.ArrayList都继承AbstractList。
Arrays.asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法,add/remove/clear调用的是父类中的方法,而父类中不支持这种操作,除非子类进行覆盖(java.util.ArrayList就进行了覆盖所以不会报错)Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。
Arrays.asList()生成的List抛UnsupportedOperationException分析的更多相关文章
- Arrays.asList引起的java.lang.UnsupportedOperationException解决方法
在项目中对List进行操作时报错java.lang.UnsupportedOperationException,后来发现操作的List是由数组转换而成的,通过看源码发现问题,并写测试程序如下. 代码块 ...
- Arrays.asList()报错java.lang.UnsupportedOperationException
问题: 使用工具类Arrays.asList()方法把数组转换成集合时,不能使用修改集合相关的方法,比如add,remove.这个ArrayList是Arrays类自己定义的一个内部类!这个内部类没有 ...
- Arrays.asList() 导致的java.lang.UnsupportedOperationException异常
Arrays.asList() 只支持遍历和取值 不支持增删改 继承至AbstractList内部类
- java Arrays.asList
List<String> list = Arrays.asList("A B C D E F G H I J K L ".split(" ")); ...
- 使用Arrays.asList抛出java.lang.UnsupportedOperationException
使用 Arrays.asList("str1", "str2")生成的List,不能进行remove.add操作,会产生异常java.lang.Unsuppor ...
- Arrays.asList的源码分析
以前一直很奇怪为什么Arrays.asList的数组不能插入新的数据,后来看了源码发现是因为内部是一个final的数组支持起来的Arraylist,下面贴入源码与分析. 1.先看Arrays的方法 我 ...
- 数组转换为List(Arrays.asList)后add或remove出现UnsupportedOperationException
Java中,可以使用Arrays.asList(T... a)方法来把一个数组转换为List,返回一个受指定数组支持的固定大小(注意是固定大小)的列表.此方法同 Collection.toArray( ...
- coding++:Arrays.asList() - java.lang.UnsupportedOperationException异常处理
这个异常遇到了才知道坑这么大,坑爹的方法. private String[] otherUserFromArray = new String[]{“3”, “4”, “发放”}; List<St ...
- JDK 之 Arrays.asList - 源码分析
Arrays工具类提供了一个方法asList, 使用该方法可以将一个变长参数或者数组转换成List . 其源代码如下: @SafeVarargs public static <T> Lis ...
随机推荐
- Intervals
Intervals Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- App网络管理
安卓开发一般都需要进行日志管理,常用操作老司机已为你封装完毕,你可以用这份工具进行管理,具体可以查看源码,现在为你开车,Demo传送门. 站点 系统日志输出工具类 → AppKeyBoardMgr g ...
- python 3 ---购物车练习
# -*- coding:utf-8 -*-#Author Chen #定义商品列表List_of_commodities = [ ('Iphone',6888), ('Mac Pro',12888) ...
- 小米Java程序员第二轮面试10个问题,你是否会被刷掉?
近日,开发者头条上分享了一篇"小米java第二轮面经",有很多的java程序员表示非常有兴趣. 下面l就和各位分享小米java第二轮面经(华为java工程师笔试面试题可以看文章某尾 ...
- distcc (dcc_execvp) ERROR: failed to exec XX: Permission denied
首先先确保一下是不是能执行下面语句: # sudo -u nobody XX --version 如果能看见版本信息,则可以不用往下看. 再检查一下distccd.service # sudo cat ...
- 全面理解 ASP.NET Core 依赖注入
DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET Core的DI实现以及对实例 ...
- C#动态获取鼠标坐标
.Net封装好的方法 int Control.MousePosition.X;int Control.MousePosition.Y; 用API方法 using System.Runtime.Inte ...
- java变量与内存深入了解
========================================================================================= 在我看来,学习jav ...
- Python之re正则模块二
13.编译的标志 可以用re.I.re.M等参数,也可以直接在表达式中添加"?(iLmsux)"标志 *s:单行,“.”匹配包括换行符在内的所有字符 *i:忽略大小写 *L:让&q ...
- maven学习之三
maven 创建工程: 1:直接命令:mvn archetype:generate -X -DgroupId=org.sselab -DartifactId=maven-for-mongodb -D ...