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
只是名字一样,包名不一样:
这个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"
这样的话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://javakk.com/132.html
本文由博客群发一文多发等运营工具平台 OpenWrite 发布
Java踩坑记系列之Arrays.AsList的更多相关文章
- java踩坑记
1.String 相等 稍微有点经验的程序员都会用equals比较而不是用 ==,但用equals就真的安全了吗,看下面的代码 user.getName().equals("xiaoming ...
- mongo java 踩坑记
为什么会有这么多坑 1. Java会把 id:String = "合法ObjectId" 好心好意的 转为 _id:ObjectId 类型. 2. 为了避免第1点, 我定义了 ...
- Spark踩坑记——Spark Streaming+Kafka
[TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...
- Spark踩坑记——数据库(Hbase+Mysql)
[TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...
- 【踩坑记】从HybridApp到ReactNative
前言 随着移动互联网的兴起,Webapp开始大行其道.大概在15年下半年的时候我接触到了HybridApp.因为当时还没毕业嘛,所以并不清楚自己未来的方向,所以就投入了HybridApp的怀抱. Hy ...
- Spark踩坑记——共享变量
[TOC] 前言 Spark踩坑记--初试 Spark踩坑记--数据库(Hbase+Mysql) Spark踩坑记--Spark Streaming+kafka应用及调优 在前面总结的几篇spark踩 ...
- Spark踩坑记——从RDD看集群调度
[TOC] 前言 在Spark的使用中,性能的调优配置过程中,查阅了很多资料,之前自己总结过两篇小博文Spark踩坑记--初试和Spark踩坑记--数据库(Hbase+Mysql),第一篇概况的归纳了 ...
- [转]Spark 踩坑记:数据库(Hbase+Mysql)
https://cloud.tencent.com/developer/article/1004820 Spark 踩坑记:数据库(Hbase+Mysql) 前言 在使用Spark Streaming ...
- Spark踩坑记——数据库(Hbase+Mysql)转
转自:http://www.cnblogs.com/xlturing/p/spark.html 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库 ...
随机推荐
- Spring属性注入(set方式、构造函数方式、p名称空间、spel、复杂类型)
1.set注入方式 (1)注入的为值类型(八大数据类型)的数据 配置文件: <?xml version="1.0" encoding="UTF-8"?&g ...
- ARCENGINE 10 开发遇到的一些问题
许多版友在刚刚使用ArcGIS 10做开发的时候,都会遇到这样那样的问题.在担任实习版主的这一个多月里,看到了这么几个与开发环境相关的问题,重复被提到相当多,于是我就做了这个FAQ.Q:哪儿有10的A ...
- Python-通过实例方法调用-统一接口的实现-getter methodcaller
某项目中,我们的代码使用的2个不同库中的图形类: Circle,Triangle 这两个类中都有一个获取面积的方法接口,但是接口的名字不一样 统一这些接口,不关心具体的接口,只要我调用统一的接口,对应 ...
- Python练习题 003:完全平方数
[Python练习题 003]一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? --------------------------------------- ...
- OpenCV 中Scalar
参考来源: 1.https://blog.csdn.net/Eroslol/article/details/52525541 2.https://www.cnblogs.com/hustdc/p/68 ...
- C语言中最常用的标准库函数
标准头文件包括: <asset.h> <ctype.h> <errno.h> <float.h> <limits ...
- 移动吉比特H2-2光猫超级用户与密码
移动吉比特H2-2光猫超级用户与密码 超级用户名CMCCAdmin 密码aDm8H%MdA----------------版权声明:本文为CSDN博主「BenSon.Album」的原创文章,遵循CC ...
- 怎样学习C语言(献给迷茫的C爱好者)!
一 .怎样学习C语言 很多人对学习C语言感到无从下手,经常问我同一个问题:究竟怎样学习C语言?我是一个教师,已经开发了很多年的程序,和很多刚刚起步的人一样,学习的第一个计算机语言就是C语言. 经过这些 ...
- spring boot:spring security实现oauth2授权认证(spring boot 2.3.3)
一,oauth2的用途? 1,什么是oauth2? OAuth2 是一个开放标准, 它允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如头像.照片.视频等), 在这个过程中无须将用户名和密码 ...
- spring boot:用dynamic-datasource-spring-boot-starter配置druid多数据源(spring boot 2.3.3)
一,dynamic-datasource-spring-boot-starter的用途? 1,dynamic-datasource-spring-boot-starter 是一个基于springboo ...