Arrays.asList() 返回的list不能add,remove
一.Arrays.asList() 返回的list不能add,remove
Arrays.asList()返回的是List,而且是一个定长的List,所以不能转换为ArrayList,只能转换为AbstractList
原因在于asList()方法返回的是某个数组的列表形式,返回的列表只是数组的另一个视图,而数组本身并没有消失,对列表的任何操作最终都反映在数组上. 所以不支持remove,add方法的
下面是一段很简单的测试代码:
public class MainFacade { public static void main(String[] args) { List<Integer> list = Arrays.asList(1,2,3); list.add(5); System.out.print(list.toString()); }
}
不过上面的代码会throw出一个UnsupportedOperationException这样的异常
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at org.popkit.MainFacade.main(MainFacade.java:14) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
终其原因是Arrays.asList方法返回的ArrayList是继承自AbstractList同时实现
了RandomAccess和Serializable接口,定义如下:
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 set(int index, E element) { throw new UnsupportedOperationException();
} public E remove(int index) { throw new UnsupportedOperationException();
}
现在知道了它throw UnsupportedOperationException异常的原因了。
通过上面的分析,我们知道,其实通过asList方法得到的List是只读的,那么平时我们怎样避免这样的错误发生?我们可以采用如下方法:
List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3));
二、Arrays.asList()陷阱
代码如下:
Java代码
public static void main(String[] args) { int[] data = {1,2,3,4,5}; List list = Arrays.asList(data); System.out.println("列表中的元素数量是:" + list.size()); }
注意这里输出的数量是1,原因是,在Arrays.asList中,其接收的参数原型其实是泛型变长参数来的,而基本类型是不能作为范型的参数,按道理应该使用包装类型,但这里缺没有报错,
因为数组是可以泛型化的,所以转换后在list中就有一个类型为int的数组
Java代码
int[] data = {1,2,3,4,5}; List list = Arrays.asList(data); System.out.println("元素类型:" + list.get(0).getClass()); System.out.println("前后是否相等:"+data.equals(list.get(0)));
可以看到,输出的为元素类型:class [I
因为jvm不可能输出array类型,array类型属于java.lang.reflect包,通过反射访问
数组的这个类,编译时候生成的。所以要改为:
Java代码
Integer[] data = {1,2,3,4,5};
List list = Arrays.asList(data);
System.out.println("列表中的元素数量是:" + list.size());
此外,假如如下代码:
Java代码
//枚举,声明一个星期
enum Week{Sun,Mon, Tue, Wed,Thu,Fri,Sat}
public static void main(String[] args) { //工作日 Week[] workDays = {Week.Mon, Week.Tue, Week.Wed,Week.Thu,Week.Fri}; //转换为列表 List<Week> list = Arrays.asList(workDays); //增加周六也为工作日 list.add(Week.Sat);
注意这里用add会出错,因为是arrays.aslist中,看代码可以看到这里返回的
ArrayList不是原来的传统意义上的java.util.arraylist了,而是自己工具类的一个
静态私有内部类,并没有提供add方法,要自己实现,所以这里是出错了,因此,
除非确信array.aslist后长度不会增加,否则谨慎使用:
List<String> abc=Arrays.asList("a","b","c"),因为这样的长度是无法再add的了
相关文章:
Arrays.asList() 返回的list不能add,remove
一.Arrays.asList() 返回的list不能add,remove Arrays.asList()返回的是List,而且是一个定长的List,所以不能转换为ArrayList,只能转换为AbstractList 原因在于asList()方法返回的是某个数组的列表形式,返回的列表只是数组的另一个视图,而数组本身并没…...
命令执行漏洞
1、命令执行漏洞 1.1、简介 Django是用Python开发的一个免费开源的Web结构,几乎包括了Web使用方方面面,能够用于快速建立高性能、文雅的网站,Diango提供了许多网站后台开发常常用到的模块,使开发者可以专注于业务部分。 1.2、漏…...
Hive 中 sort by 和 order by 的区别
文章目录 数据量大小区别作用范围 在 Hive 中, SORT BY 和 ORDER BY 都用于对查询结果进行排序,但它们在实现方式和适用场景上有一些区别。 数据量大小区别 SORT BY: SORT BY 用于在 Hive 中对查询结果进行排序,它的主要特点是在…...
网络资源利用最大化:爬虫带宽优化解决方案
大家好,作为一名专业的爬虫程序员,我们都知道在爬取大量数据的过程中,网络带宽是一个十分宝贵的资源。如果我们不合理地利用网络带宽,可能会导致爬虫任务的效率低下或者不稳定。今天,我将和大家分享一些优化爬虫带宽利…...
STDF - 基于 Svelte 和 Tailwind CSS 打造的移动 web UI 组件库,Svelte 生态里不可多得的优秀项目
Svelte 是一个新兴的前端框架,组件库不多,今天介绍一款 Svelte 移动端的组件库。 关于 STDF STDF 是一个移动端的 UI 组件库,主要用来开发移动端 web 应用。和我之前介绍的很多 Vue 组件库不一样,STDF 是基于近来新晋 js 框架 S…...
C语言一些有趣的冷门知识
文章目录 概要1.访问数组元素的方法运行结果 2.中括号的特殊用法运行结果 3.大括号的特殊用法运行结果 4.sizeof的用法运行结果 5.渐进运算符运行结果 小结 概要 本文章只是介绍一些有趣的C语言知识,纯属娱乐。这里所有的演示代码我是使用的编译器是Visual Studio …...
Oracle数据库审计
1.什么是审计 审计是用来监控和记录用户的数据库操作的 2.审计级别 语句审计权限审计对象审计 3.查看审计功能是否开启: show parameter audit;相关参数: audit_file_destOS中审计信息存放位置audit_sys_operations默认值为FALSE,即不审…...
Node.js新手在哪儿找小项目练手?
前言 可以参考一下下面的nodejs相关的项目,希望对你的学习有所帮助,废话少说,让我们直接进入正题>> 1、 NodeBB Star: 13.3k 一个基于Node.js的现代化社区论坛软件,具有快速、可扩展、易于使用和灵活的特点。它支持多种数…...
全国各城市-货物进出口总额和利用外资-外商直接投资额实际使用额(1999-2020年)
最新数据显示,全国各城市外商直接投资额实际使用额在过去一年中呈现了稳步增长的趋势。这一数据为研究者提供了对中国外商投资活动的全面了解,并对未来投资趋势和政策制定提供了重要参考。 首先,这一数据反映了中国各城市作为外商投资的热门目…...
CentOS 7查看磁盘空间
CentOS如何查看硬盘大小 CentOS是一种基于Linux的操作系统,主要用于服务器端应用。在服务器管理中,硬盘大小是一个非常重要的指标,查看硬盘大小可以帮助系统管理员有效地管理硬盘空间和避免硬盘满了的情况。 方法一:使用df命令 …...
基于PHP的轻量级博客typecho
本文完成于 5 月中旬,发布时未在最新版本上验证; 什么是 typecho ? Typecho 是一款基于 PHP 的博客软件,旨在成为世界上最强大的博客引擎。Typecho 在 GNU 通用公共许可证 2.0 下发布。支持多种数据库,原生支持 Markdo…...
MySQL多表查询
1.创建student和score表 创建score表 2.为student表和score表增加记录 向student表插入记录的INSERT语句如下: 向score表插入记录的INSERT语句如下: 1.查询student表的所有记录 2.查询student表的第2条到4条记录 3.从student表查询所有学生的学号&#…...
消息队列(12) - 定义服务器类
目录 前言设计思想 前言 之前,我们写了通信协议的具体设计,接下来我们设计服务器类 设计思想 我们先只考虑一个虚拟主机的情况下, 在一个虚拟主机的情况下,我们需要有一个session会话来帮助我们存储信息,并且既然是网络通信,那么socket关键字肯定也必不可少,我们在引入一个线…...
做正确的事 VS 正确的做事,哪个更重要?
管理大师彼得德鲁克曾在《有效的主管》一书中简明扼要地指出:“效率是以正确的方式做事,而效能则是做正确的事。效率和效能不应偏废,但这并不意味着效率和效能具有同样的重要性。我们当然希望同时提高效率和效能,但在效率与效能无…...
每日一题——寻找旋转排序数组中的最小值(I)
寻找旋转排序数组中的最小值——I 题目链接 思路 首先我们以数组[1,2,3,4,5,6,7]举个例子,经过旋转后它无非就这两种情况: 情况一:旋转过后数组变成两段有序数列: 情况二:旋转过后数组不变,仍然有序&…...
C语言每日一题:16:数对。
思路一:基本思路 1.x,y均不大于n,就是小于等于n。 2.x%y大于等于k。 3.一般的思路使用双for循环去遍历每一对数。 代码实现: #include <stdio.h> int main() {int n 0;int k 0;//输入scanf("%d%d", &n, &k);int x…...
中科亿海微浮点数转换定点数
引言 浮点数转换定点数是一种常见的数值转换技术,用于将浮点数表示转换为定点数表示。浮点数表示采用指数和尾数的形式,可以表示较大范围的数值,但存在精度有限的问题。而定点数表示则采用固定小数点位置的形式,具有固定的精度和范…...
JavaScript激活严格模式
在JavaScript中,严格模式是一种特殊的模式,通过’use strict’;去激活严格模式!在 JavaScript 中,“use strict” 是一种指令,表示在代码运行时启用严格模式,从而禁止使用一些不安全或者不规范的语法&#…...
Linux cond_resched()简介
文章目录 简介一、cond_resched1.1 _cond_resched1.2 should_resched1.2.1 __preempt_count:1.2.2 函数说明 1.3 preempt_schedule_common1.3.1 preempt_schedule_common1.3.2 preempt_latency_start/stop 1.3.3 preempt_disable_notrace 参考资料 简介 Linux 内核…...
初出茅庐的小李博客之认识编码器
编码器是什么: 一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感器,我们可以通过编码器测量到底位移或者速度信息。编码器通常由一个旋转部分和一个固定部分组成,旋转部分随着被测量的物体进行旋转,固定部分则保持不动…...
别再只会docker run了!这15个Docker CLI命令,让你效率翻倍(附真实场景案例)
别再只会docker run了!这15个Docker CLI命令,让你效率翻倍(附真实场景案例) Docker已经成为现代开发和运维的标配工具,但很多人在日常工作中仍然停留在基础的docker run和docker ps命令上。本文将带你深入15个高效Dock…...
从‘一看就会,一考就废’到稳拿高分:我的离散数学复习避坑指南与思维重塑心得
从‘一看就会,一考就废’到稳拿高分:我的离散数学复习避坑指南与思维重塑心得 第一次翻开离散数学教材时,我被那些看似简单的符号和定义迷惑了——命题逻辑像脑筋急转弯,集合运算仿佛小学生内容,图论也不过是些线条和圆…...
保姆级教程:给你的YOLOv8模型“开天眼”,手把手集成CBAM/CA注意力模块(附完整代码)
YOLOv8模型增强实战:深度集成CBAM与CA注意力机制 在目标检测领域,YOLOv8以其卓越的平衡性——兼顾速度与精度——成为众多开发者的首选框架。然而,面对复杂场景时,原始模型可能对微小目标或遮挡物体表现不佳。这时,注意…...
使用Python进行文件读写的API或方法及其注意事项
本文总结了Python文件读写的核心API及注意事项。主要内容包括:1)文件打开与关闭方法,推荐使用with语句自动管理资源;2)文件读取方法,如read()、readline()等,注意大文件应使用迭代器方式&#x…...
SuperMap iServer三种Linux安装包(tar/deb/rpm)怎么选?手把手教你根据Ubuntu/CentOS系统做决定
SuperMap iServer三种Linux安装包深度选择指南:从系统适配到实战决策 当你第一次在Linux系统上部署SuperMap iServer时,面对tar、deb、rpm三种安装包格式,是否感到无从下手?这就像面对同一款产品的三个不同包装——它们核心功能相…...
如何为AndroidPdfViewer添加PDF打印功能:完整实现指南
如何为AndroidPdfViewer添加PDF打印功能:完整实现指南 【免费下载链接】AndroidPdfViewer Android view for displaying PDFs rendered with PdfiumAndroid 项目地址: https://gitcode.com/gh_mirrors/an/AndroidPdfViewer 你是否在为Android应用中集成PDF打…...
别再套模板了!用ChatGPT+Zotero高效搭建你的第一篇SCI/EI论文框架(附保姆级步骤)
科研新手的AI加速器:用ChatGPTZotero构建高质量论文框架的实战指南 当你面对空白的文档和导师"尽快完成初稿"的催促时,是否感到无从下手?传统论文写作教程往往停留在理论层面,而今天我们要分享的是一套融合AI技术与文献…...
基于路阻信息的电动汽车充电需求分布 路网-电网耦合、排队论、温度耗电量、配电网潮流,通过时序蒙...
基于路阻信息的电动汽车充电需求分布 路网-电网耦合、排队论、温度耗电量、配电网潮流,通过时序蒙塔卡洛模拟,考虑路阻信息、温度、排队论时间,去除规模影响,配有相关文献。车-电-路网一体化负荷预测系统:多模态蒙特卡…...
IDM试用重置终极指南:免费无限续期30天的完整解决方案
IDM试用重置终极指南:免费无限续期30天的完整解决方案 【免费下载链接】idm-trial-reset Use IDM forever without cracking 项目地址: https://gitcode.com/gh_mirrors/id/idm-trial-reset 还在为Internet Download Manager(IDM)试用…...
从金属疲劳到复合材料脱粘:循环内聚力模型(CZM)的进阶应用与ABAQUS实现难点解析
从金属疲劳到复合材料脱粘:循环内聚力模型(CZM)的进阶应用与ABAQUS实现难点解析 当一架飞机在万米高空遭遇气流颠簸,机翼承受着反复的应力循环;当风力发电机叶片在昼夜不息的风力作用下持续摆动;当汽车发动…...
