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")
publicstaticListasList(T...a){
returnnewArrayList<>(a);
}
/**
*@serialinclude
*/
privatestaticclassArrayListextendsAbstractList
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")
publicT[]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;ispliterator(){
returnSpliterators.spliterator(a,Spliterator.ORDERED);
}
@Override
publicvoidforEach(Consumeraction){
Objects.requireNonNull(action);
for(Ee:a){
action.accept(e);
}
}
@Override
publicvoidreplaceAll(UnaryOperatoroperator){
Objects.requireNonNull(operator);
E[]a=this.a;
for(inti=0;ic){
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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。