1.前言如果需要将一些Arrays转Lists,可能需要用到Arrays类。除了提供一些数组的排序、查找等操作,还提供了一些非常方便的从Array.asList()转换Array到List的API,但是在使用的时候有一些需要注意的地方。本文简单介绍使用Arrays的一些注意事项。二、注意事项1、asList()不能将基本类型转换为ListasList()可以将一个数组转换为我们需要的List。但是如果数组是基本数据类型,就会有问题。例如:最终输出结果为:I/cxmyDev:listsize:1这个结果并不符合我们的预期,我们先来看看asList()的实现源码。可以看到asList()接受一个泛型变长参数,基本数据类型不能泛化。对于泛型,基本数据类型实际上会人为地成为[x.[表示这是一个数组,x是当前数组的类型。例如:int[]实际上是[I类型。举个例子来说明问题。I/cxmyDev:listsize:1I/cxmyDev:list.get(0)class:[II/cxmyDev:listtype:true可以看到确实和前面的介绍一致。因此,结论是8种基本数据类型不能在方法的泛型变长参数中使用,否则会被人为认为是[X类型参数,而不是变长参数。有时需要对这些基本数据类型进行操作。这时候就可以使用基本数据类型的包装类了。简单重写上面的一个Demo。让我们看一下输出并验证结果。listsize:6I/cxmyDev:list.get(0)class:java.lang.IntegerI/cxmyDev:listtype:false这样使用和我们的预期是一样的。2.asList()返回的列表是不可变的。查看asList()的方法签名,我们可以发现它返回的是一个ArrayList。不过需要注意的是,这个ArrayList并不是我们经常使用的ArrayList。我们经常使用的ArrayList属于java.util包,asList()返回的只是Arrays的一个内部类。虽然都是ArrayList,但是从实现和文档可以看出Arrays.ArrayList()是一个不可变的List。它虽然也是继承自AbstractList,但只是实现了一些方法,并没有实现add()、remove()等操作ArrayList的方法。例如,在上面的代码中,如果要在asList()返回的List中再插入一条数据,就会抛出UnsupportedOperationException。UnsupportedOperationException此异常在AbstractList.add()方法中抛出。可以看到,如果继承了AbstractList而没有实现其对应的方法,调用就会抛出这个异常。如果需要使用asList()方法,需要保证转换后的List不会被修改,否则会抛出异常。而如果要对Arrays.asList()转换后的ArrayList进行操作,则需要重新转换。3.总结Arrays.asList()使用的陷阱基本都解释清楚了,也给出了解决方案。【本文为专栏作家“张扬”原创稿件,转载请微信♂联系作者获得授权】点此查看作者更多好文
