Arrays.asList()得到的是真的ArrayList?操作修改集合大坑

Arrays.asList()得到的是真的ArrayList?操作修改集合大坑,今天在看阿里Java规范的时候看到一条规范,经常使用,却一直没有注意的一条!,相信大家应该踩过这个坑,下面来看一看阿里规范里的内容:,【强制】使用工具类 Arrays.asList() 把数组转换成集合时,不能使用其修改集合相关的方法,它的 add / remove / clear 方法会抛出 UnsupportedOperationException 异常。,『说明』:asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。,Arrays.asList 体现的是适配器模式,只是转换接口,「后台的数据仍是数组」。,第一种情况:list.add(“yangguanbao”); 运行时异常。,第二种情况:str[0] = “change”; list 中的元素也会随之修改,反之亦然。,想要最新版Java开发手册(黄山版)的可以自行下载一下:,黄山版(2022.2.3发布)下载链接:https://github.com/alibaba/p3c,还请点个微信公众号关注哈!,下面我们来从例子和源码来详细看一下是不是如此!!,我们看到如文档所说,报了UnsupportedOperationException异常,UnsupportedOperationException是Java编程语言中的一个异常,它表示不支持当前操作或方法。当程序尝试执行某个操作或调用某个方法,而该操作或方法不被支持时,就会抛出此异常。,图片,我们可以看到,集合随着数组的变化而变化!,Arrays.asList()方法返回的集合是基于原始数组的,也就是说,它不会创建一个新的集合对象,而是将原始数组作为集合的底层实现。因此,当您更改原始数组时,通过Arrays.asList()方法得到的集合元素也会随之改变。,图片,我们可以看到集合的数量为1,这是什么原因呢?,由于Java中的泛型不支持基本类型,所以它会将整个数组视为单个元素添加到列表中。,图片,看了一下源码明明new了一个ArrayList:,为什么不能操作修改集合呢?,我们在点进去这个ArrayList构造方法,你会发现,这个ArrayList非ArrayList!,是不是有点懵逼,我们先看一下这俩个的UML图:,图片,这个ArrayList是Arrays类的一个内部类,继承了AbstractList<E>类,但是只重写了一些方法,没有重写add、remove、clear等操作集合的方法!所以会出现UnsupportedOperationException异常!,再看一下源码:,明明有ArrayList为什么还要写一个内部类呢?,主要是为了提高代码的效率和简洁性。由于 Arrays.asList() 返回的 List 对象是一个视图,它只是一个包装了原始数组的列表,并不需要额外的空间来存储元素。因此,通过 Arrays.asList() 方法将一个数组转换成 List 可以避免创建一个新的 ArrayList 对象,从而提高代码的效率和简洁性。,我们从阿里开发手册中知道了Arrays.asList()的注意事项,自己进一步的通过例子来进行实践,最后通过源码角度来知道Arrays.asList()的原理!,我们知道了:,使用工具类 Arrays.asList() 把数组转换成集合时,不能使用其修改集合相关的方法,它的 add / remove / clear 方法会抛出 UnsupportedOperationException 异常。,更改原始数组时,通过Arrays.asList()方法得到的集合元素也会随之改变。,由于Java中的泛型不支持基本类型,所以它会将整个数组视为单个元素添加到列表中。,知道 Arrays.asList() 的返回值是ArrayList,它是Arrays类的一个内部类,为了提高代码的效率和简洁性。,以后使用就要注意这些问题!

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/26588.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年6月23日
下一篇 2023年7月15日