List 报错 java.lang.UnsupportedOperationException
废话不多说,上代码
public class ArrayListTest {
@Test
public void testList() {
List<Long> longList = new ArrayList<>();
longList.add(1L);
longList.add(2L);
longList.add(3L);
longList.add(4L);
longList.forEach(System.out::println);
System.out.println("----------------------------------");
List<Long> longList2 = Arrays.asList(1L, 2L, 3L);
longList2.add(4L);
longList2.forEach(System.out::println);
}
}
运行之后,你会看到如下结果
瞬间感觉到自己窒息了有么有,是不是不敢相信自己的眼睛啊,赶紧再运行一次,结果还是一样,就如下。
但是,愤怒归愤怒,还得解决不是,那咱们就来看看吧。
我们知道,longList
是我们自己定义的一个 java.util.ArrayList
,我们来看java.util.ArrayList
的部分结构
会发现它其实重写了add
方法,那我们调用add
方法添加元素,是没有任何毛病的,想怎么玩就怎么玩。
那咱们接下来看看Arrays.asList
这货发生了什么。
我们进入方法看看实现
看到它返回了一个ArrayList
,是不是感觉也没什么违和的,然后你就又急了,估计我要是在你面前,你就是这个表情。
别着急,别着急,重点来了。
来来来,看注释,为什么说返回的这货是一个有着list
外表的array
呢,那我们就进去看看。
进来之后你就感觉怪怪的,具体怪在哪儿吧,也说不上来,感觉看着这个包怎么那么欠抽呢。
嗷~~~,猛然想了一下,我们经常用到的好像是java.util.ArrayList
啊,这货竟然是java.util.Arrays.ArrayList
这么一想就明白了,为什么作者说这货就是“披着羊皮的狼外婆”呢,呃呃,不对,是“披着list
外皮的array
”。
然后我们再看看这货的结构。
不用找了,我不会给你截图的,这货方法还是很多的,截图有点费劲。但是你肯定找不到add
方法。
然后你就“顿悟”了,哦,原来这货压根就不让我添加元素啊。
聪明如你,当以后用到这种情况的时候就知道该怎么做了吧。
因为你看到的白羊可能不是真正的白羊,可能只是披了一张白羊皮的狼外婆。
List 报错 java.lang.UnsupportedOperationException的更多相关文章
- Arrays.asList()报错java.lang.UnsupportedOperationException
问题: 使用工具类Arrays.asList()方法把数组转换成集合时,不能使用修改集合相关的方法,比如add,remove.这个ArrayList是Arrays类自己定义的一个内部类!这个内部类没有 ...
- eclipse启动报错java.lang.IllegalStateException: LifecycleProcessor not initialized - call 'refresh' befo
报错: java.lang.IllegalStateException: LifecycleProcessor not initialized - call 'refresh' before invo ...
- 开着idea,死机了,关机重启。重启之后,重新打开idea报错java.lang.AssertionError:upexpected content storage modification
开着idea,死机了,关机重启.重启之后,重新打开idea报错java.lang.AssertionError:upexpected content storage modification. goo ...
- maven web 项目中启动报错 Java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
主要原因是maven项目里面的jar包吗,没有导入到项目中 maven web 项目中启动报错 Java.lang.ClassNotFoundException: org.springframewor ...
- 【原创】大叔问题定位分享(2)spark任务一定几率报错java.lang.NoSuchFieldError: HIVE_MOVE_FILES_THREAD_COUNT
最近用yarn cluster方式提交spark任务时,有时会报错,报错几率是40%,报错如下: 18/03/15 21:50:36 116 ERROR ApplicationMaster91: Us ...
- 云笔记项目- 上传文件报错"java.lang.IllegalStateException: File has been moved - cannot be read again"
在做文件上传时,当写入上传的文件到文件时,会报错“java.lang.IllegalStateException: File has been moved - cannot be read again ...
- 项目报错java.lang.ClassNotFoundException: org.common.SessionListener
现象:项目报错java.lang.ClassNotFoundException: org.common.SessionListener,并且myeclipse左侧Package Explorer中项目 ...
- java含有静态代码块新建的时候报错java.lang.ExceptionInInitializerError
问题描述 最近在写一些单元测试用例,为了避免连接外界服务,所有选择mock了数据库Dao层,计划将数据库所需要的数据存在List中,在类加载的时候初始化List并且填充数据.代码如下: public ...
- Spring boot Unable to start embedded Tomcat报错 java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()
Spring boot Unable to start embedded Tomcat 报错 java.lang.NoSuchMethodError: javax.servlet.ServletCon ...
随机推荐
- 【转】Sentry 入门实战
Sentry 是一个开源的实时错误追踪系统,可以帮助开发者实时监控并修复异常问题.它主要专注于持续集成.提高效率并且提升用户体验.Sentry 分为服务端和客户端 SDK,前者可以直接使用它家提供的在 ...
- Java常用工具类之数据库操作辅助类DBUtil.java
package com.qushida.util; import java.beans.BeanInfo; import java.beans.Introspector; import java.be ...
- Linux MySQL 储存中文失败简单解决办法
如图,保存的中文都变成了??? show create table table_name;可以查到表的默认编码 这里看到默认的字符集是latin1,而不是utf8 需要修改 alter databas ...
- 如何在OpenFOAM中增加边界条件【翻译】
注:如有翻译不妥,还请见谅 翻译自:http://openfoamwiki.net/index.php/HowTo_Adding_a_new_boundary_condition 首先请看:http: ...
- mybatis-generator-gui如何打包成exe
快速阅读: 用wix和inno setup把mybatis-generator-gui 打包成exe和安装文件. 以后使用的时候方便,不用每次打开eclipse运行. 使用inno setup 5 ...
- java中 什么是反射?
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射 ...
- oracle之case
使用oracle时,不免会用到判断后转换为要展示的值,这里常用case,如下: SELECT (case ) then 'yes' ) then 'no' else 'other' end) --no ...
- nrm切换npm包源
nrm可以随时切换npm包的源 npm install -g nrm 安装nrm完成 查看nrm源 nrm ls 切换源 npm use npm #也可以切换成其他源
- nginx中获取真实的客户端访问IP
date : 2019-06-28 16:54:50 author: headsen chen notice: 个人原创 1,必需要先搞清楚的基本概念 1.1 什么是remote_addr ...
- Linux怎样设置tomcat自启动
--未验证 越来越多的人把tomcat部署在Linux下,但是linux下必须用命令才能启动tomcat,如果同一个服务器下tomcat部署几个的话,每次启动就很繁琐,能不能设置在linux系统启动时 ...