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的操作都会反映在原数组上

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

java中的asList_Java Arrays.AsList原理及用法实例相关推荐

  1. JAVA中堆栈和内存分配原理

    JAVA中堆栈和内存分配原理 1.栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在 ...

  2. java显示参数,Java中的隐式参数和显示参数实例详解

    在学习java的过程中,我们会遇到许多的问题.下面我们就来看看什么是隐式参数和显示参数. 显式参数,就是平时见到的在方法名括号中间的参数,就是所谓能看得见的参数www.cppcns.com. 隐式参数 ...

  3. java中判断list是否为空的用法(亲测)

    1.如果想判断list是否为空,可以这么判断: if(null == list || list.size() ==0 ){ //为空的情况 }else{ //不为空的情况 } 2.list.isEmp ...

  4. 简述游标原理 mysql_mysql游标的原理与用法实例分析

    本文实例讲述了mysql游标的原理与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是游标 创建游标 使用游标 首发日期:2018-04-18 什么是游标: 如果你前面看过mysql函数,会发 ...

  5. java中的asList_Java中的Arrays.asList()方法

    Arrays.asList()返回一个List,但是这种情况下,其底层的实现是一个final数组,因此不能调整其尺寸 如下代码片段: package chapter11.t1; import java ...

  6. java中的asList_java中的Arrays.asList()浅析

    1.Arrays.asList(T..)使用的是静态内部类:ArrayList, (没有定义add和remove等一些方法),而不是java.util.ArrayList /** * 1.测试Arra ...

  7. java中的asList_java中Arrays.asList的使用

    Arrays.asList()方法的作用是将数组或一些元素转为集合,而你得到的集合并不是我们通常使用的List集合,而是Arrays里面的一个内部类.阿里的开发手册上java开发规范说到使用工具类Ar ...

  8. java lists.aslist_java Arrays.asList()

    在Java中比如想把一个数组转成集合,通常习惯使用Arrays.asList,但是要小心,数组通过Arrays.asList转成集合后,是不能调用集合的add,remove方法的.不然会抛异常Unsu ...

  9. java中long转int的原理

    long转为int需要强转都很熟悉,那么介绍一下强转的具体原理. 首先在计算机中,计算加法减法是用补码计算的. 正数的补码为其二进制表示.负数的补码为其模的二进制表示取反加一. 加入为八位二进制加法, ...

最新文章

  1. Python迁移MySQL数据到MongoDB脚本
  2. 双开虚拟机(一个是克隆的)网卡起不来...启动网卡报错..
  3. 开源Math.NET基础数学类库使用(11)C#计算相关系数
  4. Linux 服务器高并发调优实战
  5. OC中文件读取类(NSFileHandle)介绍和常用使用方法
  6. MFC初步教程(二)
  7. 处理整个磁盘镜像文件的单个分区
  8. .net Core 2.*使用autofac注入
  9. opcache引起的“php-cgi.exe - FastCGI 进程意外退出”,事件ID487
  10. vb导入数据到mysql_VB6.0与Access数据库增删改查功能/VB6.0与Excel数据导入导出视频教程...
  11. 2018 CSDN博客之星评选,请投我一票~
  12. TCP的MTU探测功能
  13. 论文笔记—ITS+假名管理—ASPA: Advanced Strong Pseudonym based Authentication in Intelligent Transport System
  14. 2022年人工智能发展情况及值得关注的人工智能发展趋势
  15. Apache Pulsar和Apache BookKeeper
  16. Android中的EditText属性说明
  17. Java中HashMap常见问题 -- 扩容、树化、死链问题
  18. vue的SEO优化——预渲染后路由+点击事件失效问题解决
  19. 移动硬盘的“磁盘结构损坏且无法读取”问题的解决方法
  20. linux桌面图标不见_Ubuntu系统桌面任务栏和启动器全部消失解决方案

热门文章

  1. 贪心算法之用优先队列(priority_queue)实现哈夫曼编码问题
  2. linux c的连接库和怎么同时编译多个源程序
  3. Andorid之教你全手工去除定制软件
  4. Android之解决在非Activity中使用startActivity
  5. 《看聊天记录都学不会C语言?太菜了吧》(5)打了一把游戏我学会了一个编程知识?
  6. 《零基础看得懂的C++入门教程 》——(5) 容我套个娃 循环
  7. amap vueamap 与_在vue中使用高德地图vue-amap
  8. 量子力学到底神奇在哪里?看完这个,我的认知彻底坍塌了
  9. 硕士论文研究「AI预测性取向」:化妆等因素并不影响判断
  10. 机器学习 vs 深度学习到底有啥区别,为什么更多人选择机器学习