如何在Java中使用Arrays.asList方法
这期内容当中小编将会给大家带来有关如何在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"}; List<String>asList=Arrays.asList(strs); System.out.println(asList.size()); asList.add("4"); }
运行结果如下,asList的add和remove方法都会抛异常。
3Exception in thread "main" java.lang.UnsupportedOperationExceptionat java.util.AbstractList.add(AbstractList.java:148)at java.util.AbstractList.add(AbstractList.java:108)at com.basic.practice.ArraysPractice.main(ArraysPractice.java:12)
而set方法,则可以正常调用。
asList.set(1, "4");
方法没有抛异常,正常返回结果:
3[1, 4, 3]
Process finished with exit code 0
查看下Arrays.asList()方法的源码,可以发现asList里面直接用传入的数组创建并反悔了ArrayList,而这个ArrayList是Arrays的内部类,它的size()方法直接取的是构造方法传参时的数组的长度,ArrayList虽然实现了List接口,但是并没有重写add和remove方法,但重写了get和set方法。
@SafeVarargs @SuppressWarnings("varargs") publicstatic<T>List<T>asList(T...a){ returnnewArrayList<>(a); } /** *@serialinclude */ privatestaticclassArrayList<E>extendsAbstractList<E> 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>T[]toArray(T[]a){ intsize=size(); if(a.length<size) returnArrays.copyOf(this.a,size, (Class<?extendsT[]>)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<a.length;i++) if(a[i]==null) returni; }else{ for(inti=0;i<a.length;i++) if(o.equals(a[i])) returni; } return-1; } @Override publicbooleancontains(Objecto){ returnindexOf(o)!=-1; } @Override publicSpliterator<E>spliterator(){ returnSpliterators.spliterator(a,Spliterator.ORDERED); } @Override publicvoidforEach(Consumer<?superE>action){ Objects.requireNonNull(action); for(Ee:a){ action.accept(e); } } @Override publicvoidreplaceAll(UnaryOperator<E>operator){ Objects.requireNonNull(operator); E[]a=this.a; for(inti=0;i<a.length;i++){ a[i]=operator.apply(a[i]); } } @Override publicvoidsort(Comparator<?superE>c){ Arrays.sort(a,c); } }
org.springframework.util.CollectionUtils.arrayToList()方法内部上也是会有这样的问题,底层也是使用的Arrays.asList()的方法。
二、常见的数组转list的方式
1、java8的流转换
List<String> list = Stream.of(strs).collect(Collectors.toList());
2、Collections工具类
ArrayList<String> list1 = new ArrayList<>();Collections.addAll(list1,strs);
3、多一层封装创建
List<String> strings = new ArrayList<>(Arrays.asList(strs));
上述就是小编为大家分享的如何在Java中使用Arrays.asList方法了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注恰卡编程网行业资讯频道。