Arrays.aslist新建的list集合不能add()、remove()你知道吗?
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()你知道吗?相关推荐
- java集合的批量新建_java使用Arrays.asList快速创建List集合
程序中某段案例代码如下: Map> tMap = new HashMap>(); tMap.put(name, Arrays.asList(new CronTrigger[] { trig ...
- java集合类的一些总结——Arrays.asList和Guava操作集合
使用背景 总结一下最近项目中使用到集合的两个点,一个是Arrays.asList这个方法使用的坑,另一个是利用Guava的Sets工具类去求并交集. 使用总结 Arrays.asList的坑 先上结论 ...
- Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...
Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...
- Exception in thread “main“ java.lang.UnsupportedOperationException Arrays.asList中add报错
public static void main(String[] args) {List<Integer> integers = Arrays.asList(new Integer[]{1 ...
- java stream toarray_Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...
Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...
- java 集合数组初始化_Java用Arrays.asList初始化ArrayList实例方法
Java用Arrays.asList初始化ArrayList实例方法 发布于 2020-2-29| 复制链接 在本篇文章里小妖给大家分享的是关于Java中使用Arrays.asList初始化Array ...
- 为什么阿里巴巴开发手册明确说明 Arrays.asList() 不能使用其修改方法
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:juejin.im/post/5d10e52ee51d454 ...
- arrays中copyof_为什么阿里巴巴开发手册明确说明 Arrays.asList() 不能使用其修改方法?...
作者:我想问问天 来源:https://juejin.im/post/5d10e52ee51d454f6f16ec11 引语: 阿里巴巴java开发规范说到使用工具类Arrays.asList()方法 ...
- 【Java】Arrays.asList 有坑
1.概述 阿里巴巴Java开发规范说到使用工具类Arrays.asList()方法把数组转换成集合时,不能使用其修改集合相关的方法. 因为它的add/remove/clear方法会抛出Unsuppor ...
最新文章
- 近两年跟踪速度较快的算法小结
- 网站页面内链如何布局才更有利于SEO?
- 电脑与电脑之间数据是如何传输的(数据封装与解装)
- Nginx服务器学习(一)CentOS7系统安装Nginx
- kdd数据集_learning from imbalanced data sets—第一章——KDD与数据科学概述
- 2021年PMP考试模拟题8(含答案解析)
- C语言链表翻转的三种实现方式(栈、头插法、递归法)
- python3爬虫有道翻译_【Python3爬虫】有道翻译
- linux dsdt屏蔽显卡,关于DSDT屏蔽独显的一点认识和方法
- 计算机网络的一些小知识
- 快捷截图、标注和取色的小工具snipaste
- java bigdecimal 开方_JAVA BigDecimal使用牛顿迭代法计算平方根(开方)
- 程序员自学理财8~理财必读《富人思维》精典笔记
- web开发技巧-网页排版布局常见问题及解决办法
- Body estimation 论文阅读笔记(3):Unipose:Unified Human Pose Estimation in Single Images and Videos Bruno Ar
- 从系统托盘中删除Synaptics触摸板图标
- centos下安装anaconda、scikit-learn、opencv、pytorch 和torchvision(文件在Windows下载好linux版本,使用xshll传到linux)
- 用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记...
- 认识1M带宽、1Mbps、1Mb/s 区分
- 式创新:移动互联网时代的生存法则 读后感
热门文章
- 架构师之路:从Java码农到年薪八十万的架构师
- JAVA对象布局之对象头(Object Header)
- 遥感水文前景_我国“人才紧缺”的7大专业,就业前景好,快来看看
- mysql主从复制延迟解决
- mysql 日期group_MySql 使用GROUP BY 按照日期分组统计
- syscall(SyS_gettid)
- JAVA -- NPOI在excel中画直线
- JAVA外包服务的整体工作流程有哪些
- google登陆失败问题解决
- ant安装配置问题:ANT_HOME is set incorrectly or ant could not be located. Please set ANT_HOME.