java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
就像上一篇文章,有2个方法可以实现数组和list之间的转换,但是问题总是发生在你不知道的地方。
我领导兼同事,问我,你看看你那个new出来的list能不能add(),然后让我试一下。当然 ,在编写
代码的时候,你add()是没问题的,当代码跑起来的时候,哦嘿,出问题啦,抛异常啦。如上的异常。

然后

分析原因:
终其原因是Arrays.asList方法返回的ArrayList是继承自AbstractList同时实现了RandomAccess和Serializable接口,
定义如下:

     public static <T> List<T> asList(T... a) {return new ArrayList<>(a);}

子类是正常的复写了2个方法 get(index) 和 set(index,element),这俩能正常用,但是,add()和remove()就抛异常了

 //。。。。private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable//我们再来看看AbstractList这个类的定义:public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> //这时我们发现AbstractList这个类的set add remove方法定义如下:// 没被复写,使用的时候会抛异常的。public void add(int index, E element) {throw new UnsupportedOperationException();}// 没被复写,会抛异常的。public E remove(int index) {throw new UnsupportedOperationException();}// set方法被复写了,这个是正常的。public E set(int index, E element) {throw new UnsupportedOperationException();}

现在知道了它throw UnsupportedOperationException异常的原因了。
直接扔异常。so知道啦。
通过上面的分析,我们知道,其实通过asList方法得到的List是只读的。
怎样避免这样的错误

 List<String> list = Lists.newArrayList(Arrays.asList(checkedData));//瓜娃的集合初始化的东西

在新建个集合来接收这个arrays new 出来的集合。就没有异常啦。也可以避免问题。

另外:

    private static void testArrayList() {int[] ints = {1, 2, 3, 4, 5};List list = Lists.newArrayList(Arrays.asList(ints));System.out.println("list's size is:" + list.size());System.out.println("list.get(0) 的类型:" + list.get(0).getClass());System.out.println("list.get(0) == ints:" + list.get(0).equals(ints));Integer[] ints_ = {1,2,3,4,5};List list_ = Arrays.asList(ints_);System.out.println("list_'size:" + list_.size());System.out.println("list_.get(0) 的类型:" + list_.get(0).getClass());System.out.println("list_.get(0) == ints_[0]:" + list_.get(0).equals(ints_[0]));}//测试结果如下:"C:\Program Files\Java\jdk1.8.0_73\bin\java"。。。list's size is:1list.get(0) 的类型:class [Ilist.get(0) == ints:truelist_'size:5list_.get(0) 的类型:class java.lang.Integerlist_.get(0) == ints_[0]:trueProcess finished with exit code 0

解释如下:
程序的运行结果并没有像我们预期的那样是5而是逆天的1,这是什么情况?
asList接受的参数是一个泛型的变长参数,我们知道基本数据类型是无法泛型化的,也就是说8个基本类型是无法作为asList的参数的, 要想作为泛型参数就必须使用其所对应的包装类型。但是这个这个实例中为什么没有出错呢?因为该实例是将int 类型的数组当做其参数,而在Java中数组是一个对象,它是可以泛型化的。所以该例子是不会产生错误的。既然例子是将整个int 类型的数组当做泛型参数,那么经过asList转换就只有一个int 的列表了
所以:
1.在使用asList时不要将基本数据类型当做参数。
2.得到是个不可操作的集合。

又更新了一下,之前的set是不会异常的,被正常复写了,get和set方法是被正常实现的,其他的比如add或者remove是不能用的。

Arrays.aslist新建的list集合不能add()、remove()你知道吗?相关推荐

  1. java集合的批量新建_java使用Arrays.asList快速创建List集合

    程序中某段案例代码如下: Map> tMap = new HashMap>(); tMap.put(name, Arrays.asList(new CronTrigger[] { trig ...

  2. java集合类的一些总结——Arrays.asList和Guava操作集合

    使用背景 总结一下最近项目中使用到集合的两个点,一个是Arrays.asList这个方法使用的坑,另一个是利用Guava的Sets工具类去求并交集. 使用总结 Arrays.asList的坑 先上结论 ...

  3. Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...

    Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...

  4. Exception in thread “main“ java.lang.UnsupportedOperationException Arrays.asList中add报错

    public static void main(String[] args) {List<Integer> integers = Arrays.asList(new Integer[]{1 ...

  5. java stream toarray_Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...

    Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...

  6. java 集合数组初始化_Java用Arrays.asList初始化ArrayList实例方法

    Java用Arrays.asList初始化ArrayList实例方法 发布于 2020-2-29| 复制链接 在本篇文章里小妖给大家分享的是关于Java中使用Arrays.asList初始化Array ...

  7. 为什么阿里巴巴开发手册明确说明 Arrays.asList() 不能使用其修改方法

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:juejin.im/post/5d10e52ee51d454 ...

  8. arrays中copyof_为什么阿里巴巴开发手册明确说明 Arrays.asList() 不能使用其修改方法?...

    作者:我想问问天 来源:https://juejin.im/post/5d10e52ee51d454f6f16ec11 引语: 阿里巴巴java开发规范说到使用工具类Arrays.asList()方法 ...

  9. 【Java】Arrays.asList 有坑

    1.概述 阿里巴巴Java开发规范说到使用工具类Arrays.asList()方法把数组转换成集合时,不能使用其修改集合相关的方法. 因为它的add/remove/clear方法会抛出Unsuppor ...

最新文章

  1. 近两年跟踪速度较快的算法小结
  2. 网站页面内链如何布局才更有利于SEO?
  3. 电脑与电脑之间数据是如何传输的(数据封装与解装)
  4. Nginx服务器学习(一)CentOS7系统安装Nginx
  5. kdd数据集_learning from imbalanced data sets—第一章——KDD与数据科学概述
  6. 2021年PMP考试模拟题8(含答案解析)
  7. C语言链表翻转的三种实现方式(栈、头插法、递归法)
  8. python3爬虫有道翻译_【Python3爬虫】有道翻译
  9. linux dsdt屏蔽显卡,关于DSDT屏蔽独显的一点认识和方法
  10. 计算机网络的一些小知识
  11. 快捷截图、标注和取色的小工具snipaste
  12. java bigdecimal 开方_JAVA BigDecimal使用牛顿迭代法计算平方根(开方)
  13. 程序员自学理财8~理财必读《富人思维》精典笔记
  14. web开发技巧-网页排版布局常见问题及解决办法
  15. Body estimation 论文阅读笔记(3):Unipose:Unified Human Pose Estimation in Single Images and Videos Bruno Ar
  16. 从系统托盘中删除Synaptics触摸板图标
  17. centos下安装anaconda、scikit-learn、opencv、pytorch 和torchvision(文件在Windows下载好linux版本,使用xshll传到linux)
  18. 用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记...
  19. 认识1M带宽、1Mbps、1Mb/s 区分
  20. 式创新:移动互联网时代的生存法则 读后感

热门文章

  1. 架构师之路:从Java码农到年薪八十万的架构师
  2. JAVA对象布局之对象头(Object Header)
  3. 遥感水文前景_我国“人才紧缺”的7大专业,就业前景好,快来看看
  4. mysql主从复制延迟解决
  5. mysql 日期group_MySql 使用GROUP BY 按照日期分组统计
  6. syscall(SyS_gettid)
  7. JAVA -- NPOI在excel中画直线
  8. JAVA外包服务的整体工作流程有哪些
  9. google登陆失败问题解决
  10. ant安装配置问题:ANT_HOME is set incorrectly or ant could not be located. Please set ANT_HOME.