一.背景:使用工具类 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分析的更多相关文章

  1. Arrays.asList引起的java.lang.UnsupportedOperationException解决方法

    在项目中对List进行操作时报错java.lang.UnsupportedOperationException,后来发现操作的List是由数组转换而成的,通过看源码发现问题,并写测试程序如下. 代码块 ...

  2. Arrays.asList()报错java.lang.UnsupportedOperationException

    问题: 使用工具类Arrays.asList()方法把数组转换成集合时,不能使用修改集合相关的方法,比如add,remove.这个ArrayList是Arrays类自己定义的一个内部类!这个内部类没有 ...

  3. Arrays.asList() 导致的java.lang.UnsupportedOperationException异常

    Arrays.asList() 只支持遍历和取值 不支持增删改 继承至AbstractList内部类

  4. java Arrays.asList

    List<String> list = Arrays.asList("A B C D E F G H I J K L ".split(" ")); ...

  5. 使用Arrays.asList抛出java.lang.UnsupportedOperationException

    使用 Arrays.asList("str1", "str2")生成的List,不能进行remove.add操作,会产生异常java.lang.Unsuppor ...

  6. Arrays.asList的源码分析

    以前一直很奇怪为什么Arrays.asList的数组不能插入新的数据,后来看了源码发现是因为内部是一个final的数组支持起来的Arraylist,下面贴入源码与分析. 1.先看Arrays的方法 我 ...

  7. 数组转换为List(Arrays.asList)后add或remove出现UnsupportedOperationException

    Java中,可以使用Arrays.asList(T... a)方法来把一个数组转换为List,返回一个受指定数组支持的固定大小(注意是固定大小)的列表.此方法同 Collection.toArray( ...

  8. coding++:Arrays.asList() - java.lang.UnsupportedOperationException异常处理

    这个异常遇到了才知道坑这么大,坑爹的方法. private String[] otherUserFromArray = new String[]{“3”, “4”, “发放”}; List<St ...

  9. JDK 之 Arrays.asList - 源码分析

    Arrays工具类提供了一个方法asList, 使用该方法可以将一个变长参数或者数组转换成List . 其源代码如下: @SafeVarargs public static <T> Lis ...

随机推荐

  1. .Net Core在Ubuntu上操作MySql折腾实录

    .Net Core 2.0 发布也这么久了,一直想着折腾着玩玩,无奈一直没时间,这几天准备开始好好学习下C#在跨平台方面的应用,记录下来以备自己以后回忆.学习. 本篇博客的主要内容: MySql在Ub ...

  2. Log4j – Configuring Log4j 2 - Log4j 2的配置

    Configuration Inserting log requests into the application code requires a fair amount of planning an ...

  3. JAVAscript学习笔记 js句柄监听事件 第四节 (原创) 参考js使用表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Cache 和 Buffer 都是缓存,主要区别是什么?

    存储器的高速缓冲存储器存储了频繁访问的RAM位置的内容及这些数据项的存储地址.当处理器引用存储器中的某地址时,高速缓冲存储器便检查是否存有该地址.如果存有该地址,则将数据返回处理器;如果没有保存该地址 ...

  5. Maven 浅谈一

    一.Maven的作用 在开发中,为了保证编译通过,我们会到处去寻找jar包,当编译通过了,运行的时候,却发现"ClassNotFoundException",我们想到的是,难道还差 ...

  6. Markdown简易语法说明

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  7. 引用reference作用域scope闭包closure上下文context用法

    引用(reference).作用域(scope).闭包(closure)以及上下文(context)是JavaScript重中之重的基础,也是学习好JavaScript的基础.在这里我以浅显的理解给大 ...

  8. 《天书夜读:从汇编语言到windows内核编程》八 文件操作与注册表操作

    1)Windows运用程序的文件与注册表操作进入R0层之后,都有对应的内核函数实现.在windows内核中,无论打开的是文件.注册表或者设备,都需要使用InitializeObjectAttribut ...

  9. 快速搭建Japser Report

    下列步骤是快速搭建一个Jasper Report,开发中遇到的坑会在下一个博客中提及,如有任何问题,欢迎留言评论 第一步,打开Jaspersoft Studio,界面跟eclispse一样 创建项目: ...

  10. 有序GUID

    背景 常见的一种数据库设计是使用连续的整数为做主键,当新的数据插入到数据库时,由数据库自动生成.但这种设计不一定适合所有场景. 随着越来越多的使用Nhibernate.EntityFramework等 ...