资讯专栏INFORMATION COLUMN

Arrays.asList这样用是不对的

IT那活儿 / 2762人阅读
Arrays.asList这样用是不对的

点击上方“IT那活儿”,关注后了解更多精彩内容!!!



 问题描述 


在开发中常常需要将数组转为集合,在本次开发中就用到了Arrays.asList()方法将字符串转为集合。然而向转完之后的集合中添加元素、或者是改变集合结构,都会遇到图中的问题,我一时间也是很懵逼。
一开始我为了排除其他是代码的问题,于是写个main方法专门对Arrarys.asList()方法进行测试。
结果如下,也是抛出了java.lang.UnsupportedOperationException异常信息。


 问题排查 


那么问题就来了:这是为啥呢?

我们顺着Arrarys.asList()这个方法一层一层往里找吧!当进入这个方法时,首先我们可以看到方法第一行注释:Returns a fixed-size list backed by the specified array
这行注释的大概意思就是:此方法返回一个基于特定数组的固定大小集合。
再看看方法结构,方法的返回值是我们常见ArrayList。但是这个却不是我们常用的那个Java.util包下的ArrayList。此处的ArrayList是Arrays类的一个内部类。
接着我们看到这个内部类也继承了AbstractList类,但是只继承部分方法,没有我们常用的ArrayList类中的add()、remove()等方法。
所以当我们使用Arrarys.asList()声明的集合去添加元素或者改变集合结构时,会抛出java.lang.UnsupportedOperationException异常。
此处可能也是对应了Returns a fixed-size list backed by the specified array这个注解,所以没有写入add等方法。
这样常用的方法也是在不经意间才会发现问题,但只要深入研究一下,问题很快就能解决,毕竟读源码是一个好习惯


 解决方案 


此处,我使用了一个简单的方式去解决这个问题,即使用流处理Collectors.toList()将对象转换为java.util下ArrayList。功能正常使用,这样简单又方便。如下图:


 总结 


虽然Arrays.asList方法不够完美,但是处理一些对象转换,使用我们常用的一些contains方法等都是不错的选择;
但是如add()/remove()/clear()等方法不能使用,只要是修改被Arrays.asList声明的集合,就会报java.lang.UnsupportedOperationException异常。
这也给我们一个启发,想要写出质量高的代码,写的时候就得考虑的多一点。


本文作者:李伟业

本文来源:IT那活儿(上海新炬王翦团队)


分享

收藏

点赞

在看

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129663.html

相关文章

  • JDK 1.8 新特性学习(Stream)

    摘要:会在数据源内部隐式的遍历进行处理。会并行遍历数据,将数据分成若干段,同时进行处理,最终汇总结果一起输出。结束操作会触发实际计算,计算发生时会把所有中间操作积攒的操作以的方式执行,这样可以减少迭代次数。为函数式编程而生。 Stream实现了对数据源的流式处理,它可以并行操作,提高数据处理效率。 什么是流 流不是集合,它不对数据做保存,只是最数据进行算法处理,比如最大值,最小值,排序等操作...

    yhaolpz 评论0 收藏0
  • 千万不要这样使用 Arrays.asList !

    摘要:而一开始的设计时用于打印数组而设计的,但开始,有了另一个比较更方便的打印函数于是打印不再使用,而恰巧可用于将数组转为集合。错误用法如果你这样使用过,那你要注意下了。 使用Arrays.asList()的原因无非是想将数组或一些元素转为集合,而你得到的集合并不一定是你想要的那个集合。 而一开始asList()的设计时用于打印数组而设计的,但jdk1.5开始,有了另一个比较更方便的打印函数...

    Nosee 评论0 收藏0
  • 《Java编程思想》-- 持有对象 -- 添加一组元素

    摘要:方法接受一个对象,以及一个数组或是一个用逗号分隔的列表,并将元素添加到中。工作的很好,因为他从第一个参数中了解到了目标类型是什么。 ArrayList.asList() 接受一个数组或是用逗号分隔的元素列表,也可以用可变参数,然后将其转为一个List对象。 Collections.addAll()方法接受一个Collection对象,以及一个数组或是一个用逗号分隔的列表,并将元素添加...

    tomlingtm 评论0 收藏0
  • 《Java8实战》-第五章读书笔记(使用流Stream-01)

    摘要:跳过元素流还支持方法,返回一个扔掉了前个元素的流。归约到目前为止,我们见到过的终端操作都是返回一个之类的或对象等。这样的查询可以被归类为归约操作将流归约成一个值。通过反复使用加法,你把一个数字列表归约成了一个数字。 使用流 在上一篇的读书笔记中,我们已经看到了流让你从外部迭代转向内部迭代。这样,你就用不着写下面这样的代码来显式地管理数据集合的迭代(外部迭代)了: /** * 菜单 ...

    OldPanda 评论0 收藏0
  • Java 8之stream进阶

    摘要:获取每个元素的字符串长度放入新流中,然后转为类型。归约归约就是把整个流归约成一个值的操作,比如求集合中最大的元素所有元素值的和之类的操作。 前言: 上一篇文章 Java 8之stream介绍和使用 中讲解了stream的定义和用法,简单介绍几个最基本最常用的方法,其实stream还有更强大的功能,这篇文章就会给大家介绍stream的进阶用法。 筛选: 在上一篇文章中我们介绍了使用fi...

    Jaden 评论0 收藏0
  • Java Arrays.asList()与Arrays.sort()分析

    摘要:与分析声明文章均为本人技术笔记,转载请注明出处示例源码将数组或者指定个数的对象转换为是的内部类实例,与不是一回事,长度固定,只能遍历访问,不能使用修改集合相关的方法,比如方法会抛出异常适配器模式修改数组内容后,内容也会随之改变,体现适配器模 Java Arrays.asList()与Arrays.sort()分析 声明 文章均为本人技术笔记,转载请注明出处https://segment...

    pkhope 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<