今天在看阿里Java规范的时候看到一条规范,经常使用,却一直没有注意的一条!
为淮北等地区用户提供了全套网页设计制作服务,及淮北网站建设行业解决方案。主营业务为成都网站设计、成都做网站、淮北网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
相信大家应该踩过这个坑,下面来看一看阿里规范里的内容:
【强制】使用工具类 Arrays.asList() 把数组转换成集合时,不能使用其修改集合相关的方法,它的 add / remove / clear 方法会抛出 UnsupportedOperationException 异常。
『说明』:asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。
Arrays.asList 体现的是适配器模式,只是转换接口,「后台的数据仍是数组」。
String[] str = new String[]{ "yang", "guan", "bao" };
List list = Arrays.asList(str);
第一种情况:list.add("yangguanbao"); 运行时异常。
第二种情况:str[0] = "change"; list 中的元素也会随之修改,反之亦然。
想要最新版Java开发手册(黄山版)的可以自行下载一下:
黄山版(2022.2.3发布)下载链接:https://github.com/alibaba/p3c
还请点个微信公众号关注哈!
下面我们来从例子和源码来详细看一下是不是如此!!
String[] arr = {"Hello", "World"};
List stringList = Arrays.asList(arr);
stringList.add("报错了!");
System.out.println(stringList);
我们看到如文档所说,报了UnsupportedOperationException异常,UnsupportedOperationException是Java编程语言中的一个异常,它表示不支持当前操作或方法。当程序尝试执行某个操作或调用某个方法,而该操作或方法不被支持时,就会抛出此异常。
String[] arr = {"Hello", "World"};
List stringList = Arrays.asList(arr);
arr[0] = "修改了呢";
System.out.println(stringList);
我们可以看到,集合随着数组的变化而变化!
Arrays.asList()方法返回的集合是基于原始数组的,也就是说,它不会创建一个新的集合对象,而是将原始数组作为集合的底层实现。因此,当您更改原始数组时,通过Arrays.asList()方法得到的集合元素也会随之改变。
int[] ints = {1,2};
List ints1 = Arrays.asList(ints);
for (int[] ints2 : ints1) {
System.out.println(ints2);
}
System.out.println(ints1.size());
我们可以看到集合的数量为1,这是什么原因呢?
由于Java中的泛型不支持基本类型,所以它会将整个数组视为单个元素添加到列表中。
看了一下源码明明new了一个ArrayList:
public static List asList(T... a) {
return new ArrayList<>(a);
}
为什么不能操作修改集合呢?
我们在点进去这个ArrayList构造方法,你会发现,这个ArrayList非ArrayList!
是不是有点懵逼,我们先看一下这俩个的UML图:
这个ArrayList是Arrays类的一个内部类,继承了AbstractList
再看一下源码:
private static class ArrayList extends AbstractList
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
}
明明有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类的一个内部类,为了提高代码的效率和简洁性。
以后使用就要注意这些问题!
分享标题:Arrays.asList()得到的是真的ArrayList?操作修改集合大坑
转载来源:http://www.shufengxianlan.com/qtweb/news39/405889.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联