Java Arrays.asList使用方法解析
Arrays.asList()方法的作用是将数组或一些元素转为集合,而你得到的集合并不是我们通常使用的List集合,而是Arrays里面的一个内部类。阿里的开发手册上java开发规范说到使用工具类Arrays.asList()方法把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出java.lang.UnsupportedOperationException的异常。
一、Arrays.asList的方法说明
publicstaticvoidmain(String[]args){ String[]strs={"1","2","3"}; ListasList=Arrays.asList(strs); System.out.println(asList.size()); asList.add("4"); }
运行结果如下,asList的add和remove方法都会抛异常。
3
Exceptioninthread"main"java.lang.UnsupportedOperationException
atjava.util.AbstractList.add(AbstractList.java:148)
atjava.util.AbstractList.add(AbstractList.java:108)
atcom.basic.practice.ArraysPractice.main(ArraysPractice.java:12)
而set方法,则可以正常调用。
asList.set(1,"4");
方法没有抛异常,正常返回结果:
3
[1,4,3]Processfinishedwithexitcode0
查看下Arrays.asList()方法的源码,可以发现asList里面直接用传入的数组创建并反悔了ArrayList,而这个ArrayList是Arrays的内部类,它的size()方法直接取的是构造方法传参时的数组的长度,ArrayList虽然实现了List接口,但是并没有重写add和remove方法,但重写了get和set方法。
@SafeVarargs @SuppressWarnings("varargs") publicstaticList asList(T...a){ returnnewArrayList<>(a); } /** *@serialinclude */ privatestaticclassArrayList extendsAbstractList implementsRandomAccess,java.io.Serializable { privatestaticfinallongserialVersionUID=-2764017481108945198L; privatefinalE[]a; ArrayList(E[]array){ a=Objects.requireNonNull(array); } @Override publicintsize(){ returna.length; } @Override publicObject[]toArray(){ returna.clone(); } @Override @SuppressWarnings("unchecked") public T[]toArray(T[]a){ intsize=size(); if(a.length )a.getClass()); System.arraycopy(this.a,0,a,0,size); if(a.length>size) a[size]=null; returna; } @Override publicEget(intindex){ returna[index]; } @Override publicEset(intindex,Eelement){ EoldValue=a[index]; a[index]=element; returnoldValue; } @Override publicintindexOf(Objecto){ E[]a=this.a; if(o==null){ for(inti=0;i spliterator(){ returnSpliterators.spliterator(a,Spliterator.ORDERED); } @Override publicvoidforEach(Consumeraction){ Objects.requireNonNull(action); for(Ee:a){ action.accept(e); } } @Override publicvoidreplaceAll(UnaryOperator operator){ Objects.requireNonNull(operator); E[]a=this.a; for(inti=0;i c){ Arrays.sort(a,c); } }
org.springframework.util.CollectionUtils.arrayToList()方法内部上也是会有这样的问题,底层也是使用的Arrays.asList()的方法。
二、常见的数组转list的方式
1、java8的流转换
List
2、Collections工具类
ArrayList
list1=newArrayList<>();
Collections.addAll(list1,strs);
3、多一层封装创建
List
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。