java中的asList_Java Arrays.AsList原理及用法实例

java.util.Arrays的asList方法可以方便的将数组转化为集合,我们平时开发在初始化ArrayList时使用的比较多,可以简化代码,但这个静态方法asList()有几个坑需要注意:

一. 如果对集合使用增加或删除元素的操作将会报错

如下代码:

List list = Arrays.asList("a","b","c");

list.add("d");

输出结果:

Exception in thread "main" java.lang.UnsupportedOperationException

at java.util.AbstractList.add(AbstractList.java:148)

at java.util.AbstractList.add(AbstractList.java:108)

at ArraysAsListTest.main(ArraysAsListTest.java:7)

Arrays.asList的源码虽然返回的是一个ArrayList,但这个ArrayList是Arrays内部的一个静态类(java.util.Arrays.ArrayList),并不是我们平时用的java.util.ArrayList只是名字一样,包名不一样:

17cbfd92f4a9d3c0d24545d44b2f9303.png

这个ArrayList也继承自AbstractList,但是却没有实现add(),remove()方法用这两个方法其实调用的是AbstractList的默认方法:

public void add(int index, E element) {

throw new UnsupportedOperationException();

}

直接抛出" UnsupportedOperationException"的异常!

所以当我们调用这个ArrayList的add方法时其实是调用了抽象集合类里的add方法,就抛出了上面的异常,原因是数组虽然提供了转集合的方法, 但本质上还是个数组,数组的长度是固定的,所以jdk的作者没有实现add()和remove()方法。

大家在使用的时候需要注意,要结合具体业务场景判断:如果只是对转成后的集合进行遍历或使用stream()流操作都没有问题,可以正常使用(修改元素也没问题) 但如果需要新增元素或删除元素等改变集合长度的操作就要避免,否则报错就会影响到我们正常的业务逻辑。

二. 长度问题

还是Arrays的asList(),该方法无法将一个基本类型的数组转换成集合List,或者说基本类型虽然能转换成功,但不是"我们想要的集合",因为asList方法接收的是一个泛型的变长参数。

而基本数据类型是无法被泛型化的,这样的话对于泛型而言,基本数据类型会被作为一个"[x"的类型,"["表示这是一个数组,"x"为当前数组的类型,例如: int[] 实际上它的类型是"[I"

2915f37786d8492abb61cbbbf3624794.png

这样的话Arrays.asList传入的参数是基本类型的话,会把数组当做一个元素处理(长度=1),如果我们要遍历List或获取List的长度就不准确了,类似下面的用法:

int array[] = {1,2,3,4,5};

List list = Arrays.asList(array);

System.out.println("长度="+list.size());

System.out.println("是否含有元素3="+list.contains(3));

输出结果:

长度=1是否含有元素3=false

如果我们的代码里用到了这样获取长度或判断是否包含指定元素的操作就要注意写法,否则就会影响我们的逻辑流程!

为避免这样的问题出现,有很多种其他写法,比如将array转成包装类(即引用类型),如下:

Integer array[] = {1,2,3,4,5};

List list = Arrays.asList(array);

System.out.println("长度="+list.size());

System.out.println("是否含有元素3="+list.contains(3));

输出结果:

长度=5是否含有元素3=true

当然也可以使用google的集合类"Ints.asList",如下:

int array[] = {1,2,3,4,5};

List list = Ints.asList(array);

System.out.println("长度="+list.size());

System.out.println("是否含有元素3="+list.contains(3));

输出结果:

长度=5是否含有元素3=true

但是google的Ints.asList方法返回的list也是一个自己实现的集合,同样不支持add和remove方法,如果既要保证转换成list后的数据长度正确又要能增删操作的话,就用java.util.ArrayList吧。

三. Arrays.asList方法返回的是数组的一个视图,也就是说对这个list的操作都会反映在原数组上

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么顶尖高手,都是长期主义者?

点击蓝字关注,回复“职场进阶”获取职场进阶精品资料一份在当下这个浮躁的社会,很多人都认为“快”才是真理,“慢”就是原罪。大家都对一夜腾飞的故事津津乐道,却觉得坚守一生最终获得大成的故事不够性感。但事实是怎么样的呢&…

java中函数是什么_[一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...

本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍什么是函数式编程?java程序员第一反应可能会理解成类的成员方法一类的东西此处并不是这个含义,更接近是数学上的函数看一下百度百科中关于函数的说明函数的定义:给定一个数集A,假设其…

分布式系统不得不说的CAP定理

21天学会C语言?3天学会弹钢琴?放弃一切错误方法,从今天开始“刻意练习”,因为这才是最强大的,也是唯一正确的学习方法。--《刻意练习》Anders Ericsson引言CAP问题已经成了计算机科学中一个研究领域,之前说…

[PAT乙级]1021 个位数统计

输入格式: 每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。 输出格式: 对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。 输入样例:…

Largest Rectangle in a Histogram (动态规划+奇思妙想单调栈)求最大矩状图面积

感觉动态规划都是玄妙的很,思维题吧(单调栈思维) 题解:让求最大矩形面积,宽为1,暴力超时 可以发现 当第i-1个比第i个高的时候 比第i-1个高的所有也一定比第i个高 于是可以用到动态规划的思想 令l…

ASP.NET Core分布式项目实战(详解oauth2授权码流程)--学习笔记

最近公司产品上线,通宵加班了一个月,一直没有更新,今天开始恢复,每日一更,冲冲冲任务13:详解oauth2授权码流程我们即将开发的产品有一个用户 API,一个项目服务 API,每个服务都需要认…

C++类模板中的static成员

从类模板实例化的每一个模板类有自己的类模板数据成员&#xff0c;该模板的所有对象共享一个static数据成员。 代码如下: #include <iostream> using namespace std;template<typename T> class Person { public:static int a;};template<typename T> int …

C#并发编程之初识并行编程

写在前面之前微信公众号里有一位叫sara的朋友建议我写一下Parallel的相关内容&#xff0c;因为手中商城的重构工作量较大&#xff0c;一时之间无法抽出时间。近日&#xff0c;这套系统已有阶段性成果&#xff0c;所以准备写一下Parallel的相关内容&#xff0c;正好也延续之前的…

java 下拉列表 枚举_「Java三分钟」精准而优雅——枚举类详解

关注我&#xff0c;每天三分钟&#xff0c;带你轻松掌握一个Java相关知识点。1.为什么要用枚举你在读一个老工程代码时&#xff0c;是否经常看见有几个类&#xff0c;里面放着成百上千的静态常量&#xff0c;场面相当恐怖&#xff0c;而且如果不加注释&#xff0c;很多你都不知…

Not so Mobile(二叉树递归输入同时建树){天平}

题意&#xff1a; 给出一个大天平&#xff0c;大天平中还有许多小天平&#xff0c;求出所有的天平是否平衡&#xff1b;平衡条件为wldl wrdr&#xff1b; 题目 Before being an ubiquous communications gadget, a mobile was just a structure made of strings and wires …

在阿里云函数计算上部署.NET Core 3.1

使用阿里云ECS或者其他常见的VPS服务部署应用的时候&#xff0c;需要手动配置环境&#xff0c;并且监测ECS的行为&#xff0c;做补丁之类的&#xff0c;搞得有点复杂。好在很多云厂商&#xff08;阿里云、Azure等&#xff09;提供了Serverless服务&#xff0c;借助于Serverless…

java 持续交付_【Java架构:持续交付】一篇文章搞掂:Jenkins

1.1、使用yum安装JDKa、检查系统是否有安装open-jdkrpm -qa |grep javarpm -qa |grep jdkrpm -qa |grep gcj如果没有输入信息表示没有安装。如果安装可以使用rpm -qa | grep java | xargs rpm -e --nodeps 批量卸载所有带有Java的文件 这句命令的关键字是javab、检索yum中包含…

抱歉,请不要把 “业务逻辑层” 理解为 “业务中台”

这是头哥侃码的第197篇原创在IAS2019中台架构峰会上&#xff0c;我曾与一位年轻帅气的技术小伙来了一番有趣的对话。因为和朋友有约&#xff0c;所以我在现场互动结束之后&#xff0c;就急匆匆地跟其他嘉宾打了声招呼&#xff0c;抱着笔记本冲出了会场。但没想到刚到电梯口&…

C++异常处理分析

C异常处理基本语法: 代码如下: #include <iostream> using namespace std;int divide(int x, int y) {if (y 0) throw y;return x / y; }void test01() {//试着去捕获异常try{divide(10, 0);}/*catch (int){cout << "除数为0!" << endl;} */catc…

陌陌的 Service Mesh 探索与实践

Service Mesh Virtual Meetup 是 ServiceMesher 社区和 CNCF 联合主办的线上系列直播。本期为 Service Mesh Virtual Meetup#1 &#xff0c;邀请了四位来自不同公司的嘉宾&#xff0c;从不同角度展开了 Service Mesh 的应用实践分享&#xff0c;分享涵盖来自陌陌和百度的 Servi…

C标准输入流

标准输入流对象cin&#xff0c;重点掌握的函数: cin.get()//一次只能读取一个字符 cin.get(一次参数)//读一个字符 cin.get(两个字符)//可以读字符串 cin.getline() cin.ignore() cin.peek() cin.putback() 标准输入流cin.get() 代码如下: #include <iostream> using n…

Harmonic Number(欧拉公式或技巧打表)LightOJ - 1234(求调和级数的和)

题意&#xff1a;求f(n)1/11/21/31/4…1/n (1 ≤ n ≤ 108).&#xff0c;精确到10-8 (原题在文末&#xff09; 知识点&#xff1a;调和级数(即f(n))至今没有一个完全正确的公式&#xff0c;但欧拉给出过一个近似公式&#xff1a;(n很大时) f(n)≈ln(n)C1/2*n 欧拉常数值&…

教你配置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了

一&#xff1a;背景1. 讲故事前几天公众号里有位兄弟看了几篇文章之后&#xff0c;也准备用windbg试试看&#xff0c;结果这一配就花了好几天&#xff0c;(づ╥﹏╥)づ&#xff0c;我想也有很多跃跃欲试的朋友在配置的时候肯定会遇到这样和那样的问题&#xff0c;所以我觉得有必…

C标准输出流

标准输入流对象cin&#xff0c;重点掌握的函数: cout.flush()//刷新缓冲区 cout.put()//向缓冲区写字符 cout.write()//二进制流的输出 cout.width()//输出格式控制 cout.fill() cout.set(标记) cout.flush() 代码如下: #include <iostream> using namespace std;void…

Autofac在.NET Core 中的使用

前言Autofac 是一款.NET IoC 容器 . 它管理类之间的依赖关系, 从而使应用在规模及复杂性增长的情况下依然可以轻易地修改 。.NET CORE 中也内置了依赖注入&#xff0c;但是有些情况下需要用到Autofac去进行依赖注入&#xff0c;Autofac支持的所有注入方式以外&#xff0c;还支持…