Java学习中,Arrays转List的那些坑
Java开发中经常遇到Arrays这个类,它除了提供一些对数组的排序和搜索等操作之外,还提供了一些API,可以从Array.asList()非常方便的将Array转为List。
本文主要就是讲一下Arrays转List的那些坑及这些坑该怎么填
1、asList() 无法将基本类型转换为List
asList()可以将一个数组转换为我们需要的List,但是不能是基本数据类型的
输出的结果:
I/cxmyDev: list size : 1
这个结果跟我们想的不一样吧,为什么?先来看看asList()的实现源码
可以看到asList()是接受一个泛型的变长参数的,而基本数据类型是无法被泛型化的。而对于泛型而言,基本数据类型,实际上会被人为是一个[x的类型。[表示这是一个数组,x为当前数组的类型。例如:int[]实际上它的类型是[I 。
再来看一个例子:
还是输出:
I/cxmyDev: list size : 1
I/cxmyDev: list.get(0) class : [I
I/cxmyDev: list type : true
得出结论:8种基本数据类型,不能被用在方法的泛型变长参数中,否则会被认为是一个[X类型的参数,而不是可变长参数
应对方法:这就要对这些基本数据类型进行操作,可以使用基本数据类型的包装类。
改写一个上面的Demo:
运行,结果:
list size : 6
I/cxmyDev: list.get(0) class : java.lang.Integer
I/cxmyDev: list type :false
完美解决!!!!!
想要学习Java开发的同学,可以参考千锋成都Java培训班提供的学习大纲;
再说一下第二个坑:asList()返回的列表是不可变的
asList()返回的ArrayList不是我们日常所用的ArrayList,我们经常使用的ArrayList是属于java.util包下面的,而asList()返回的只是Arrays的一个内部类,
Arrays.ArrayList()虽然是继承自AbstractList,,,但是,,,它并没有实现其中的add() 、remove()等用于操作ArrayList的方法。
看这个例子,若果你想在asList()返回的List中,再插入一条数据,将会抛出UnsupportedOperationException这个异常。
nsupportedOperationException这个异常,是在AbstractList.add()方法中抛出的。
可以看到,如果继承AbstractList而不去实现它对应的方法,调用就会抛出此异常。
如果需要使用asList()方法的话,就需要确保转换出来的List将不会再被修改,否者会抛出异常。
而如果想对Arrays.asList()转换的ArrayList做操作,就需要再一次对其进行转换。