前言:本文介绍了Java中数组转List的三种情况的优缺点对比,以及应用场景的对比,分析程序员经常犯的类型转换错误的原因。1.最常用的(不一定是最好的)方法是使用Arrays.asList(strArray)方法。数组转为List后,不能对List进行增删改,只能检查修改,否则会抛出异常。关键代码:Listlist=Arrays.asList(strArray);privatevoidtestArrayCastToListError(){String[]strArray=newString[2];Listlist=Arrays.asList(strArray);//插入一条数据到转换后的列表list.add("1");System.out.println(list);}执行结果:Exceptioninthread"main"java.lang.UnsupportedOperationExceptionatjava.util.AbstractList.add(AbstractList.java:148)atjava.util.AbstractList.add(AbstractList.java:108)在com.darwin.junit.Calculator.testArrayCastToList(Calculator.java:19)在com.darwin.junit.Calculator.main(Calculator.java:44)在list.add("1"),抛出异常:UnsupportedOperationException。原因分析:Arrays.asList(strArray)的返回值是java.util.Arrays类中的私有静态内部类java.util.Arrays.ArrayList,不是java.util.ArrayList类。java.util.Arrays.ArrayList类有set()、get()、contains()等方法,但是没有add()和remove()方法,所以调用add()方法会报错。使用场景:Arrays.asList(strArray)方法只能在数组转成List后使用,不需要在里面增删值,只作为读取的数据源.2、数组转List后,支持增删改查的方??法。通过ArrayList构造函数,将Arrays.asList(strArray)的返回值从java.util.Arrays.ArrayList转换为java.util.ArrayList。关键代码:ArrayListlist=newArrayList(Arrays.asList(strArray));privatevoidtestArrayCastToListRight(){String[]strArray=newString[2];ArrayListlist=newArrayList(Arrays.asList(strArray));list.add("1");System.out.println(list);}执行结果:成功添加元素“1”。[null,null,1]使用场景:数组转换成List后,需要对List进行增删改查,当List的数据量不大时可以使用。3.使用集合工具类的Collections.addAll()方法(效率最高)通过Collections.addAll(arrayList,strArray)方法进行转换,根据数组的长度创建一个等长的List,并然后使用Collections.addAll()方法将数组中的元素转换为二进制再添加到List中,这是最高效的方法。关键代码:ArrayListarrayList=newArrayList(strArray.length);Collections.addAll(arrayList,strArray);测试:privatevoidtestArrayCastToListEfficient(){String[]strArray=newString[2];ArrayListarrayList=newArrayList(strArray.length);Collections.addAll(arrayList,strArray);arrayList.add("1");System.out.println(arrayList);}执行结果:添加元素“1”成功。[null,null,1]使用场景:数组转换为List后,需要对List进行增删改查。在List数据量巨大的情况下,优先使用它来提高运行速度。注:附上Collections.addAll()方法源码:publicstaticbooleanaddAll(Collectionc,T...elements){booleanresult=false;for(Telement:elements)result|=c。add(element);//result与c.add(element)按位或运算,然后赋值给resultreturnresult;}问题解答问题:如果数组类型是整型数组,转换成a会不会报错列表?答:在JDK1.8环境下测试,这三种转换方式都没有问题。使用安全。Integer[]整数数组转List的方法及测试结果如下:方法一:不支持增删Integer[]intArray1=newInteger[2];Listlist1=Arrays.asList(intArray1);System.out.println(list1);运行结果:[null,null]方法二:支持增删操作Integer[]intArray2=newInteger[2];Listlist2=newArrayList(Arrays.asList(intArray2));list2.add(2);System.out.println(list2);运行结果:[null,null,2]方法三:支持增删改查,数据量大,效率最高的Integer[]intArray3=newInteger[2];Listlist3=newArrayList(intArray3.length);Collections.addAll(list3,intArray3);list3.add(3);System.out.println(list3);运行结果:[null,null,3]综上所述,integer将Integer[]数组转换为List的正确方式应该是这样的。容易出错的点:可能会出错,可以这样转换:int[]intArray1=newint[2];Listlist1=Arrays.asList(intArray1);//这里报错!!!错误原因:等号两边的类型不一致,当然编译失败。分析见下文。那么在声明数组时,使用int[]或Integer[],哪种声明方式可以正确转换为List呢?答:只能使用Integer[]转换List,即只能使用基本数据类型的封装类型。直接转换为列表。原因分析如下:我们看Java源码中List的定义(不要怕看源码,看我的分析,很容易理解):publicinterfaceListextendsCollection{省略...}再来看Arrays.asList()在Java源码中的定义:publicstaticListasList(T...a){returnnewArrayList<>(a);}从上面的源码可以看出即在声明List时,需要传递一个泛型作为形参,asList()参数类型也是泛型中的通配符类型。Java中的所有泛型类型都必须是引用类型。什么是引用类型?Integer是引用类型,那么int是什么类型呢?Int是基本数据类型,不是引用类型。这就是java中没有List,只有List的原因。以此类推:其他8种基本数据类型byte、short、int、long、float、double、char都不是引用类型,所以这8种基本数据类型都不能作为List的形参。但是String、array、class、interface都是引用类型,都可以作为List的形参,所以就有了List接口类型的集合,而List有上面的基础知识,我们来看看为什么第二行下面两行代码可以编译。第三行编译出错?int[]intArray1=newint[1];Arrays.asList(intArray1);//编译没有出错Listlist1=Arrays.asList(intArray1);//编译出错答:第二行代码,Arrays.asList()方法的入参是引用类型int[],那么返回值类型一定是List第三行报错,因为相等两边的类型符号不一致,左:List,右List总结现在你应该明白为什么int[]不能直接转为List,而Integer[]却可以转为List了。因为List中泛型必须是引用类型,int是基本数据类型,不是引用类型,但是int的包装类型Integer是类类型,属于引用类型,所以Integer可以作为List形参,java中可以存在List,但没有List类型。在编码的时候,我们不仅要知道它是什么,还要知道它为什么是。只有分析JDK源码,才能获得第一手资料,不仅是如何使用,还有为什么要这样使用。