一、前言
如果有对于一些 Array 到 List 转换的需要的话,可能就需要用到 Arrays 这个类,它除了提供一些对数组的排序和搜索等操作之外,还提供了一些从 Array.asList() 这个非常方便的将 Array 转为 List 的 Api ,但是它使用起来也有一些需要注意的地方。
本篇就简单介绍一下使用 Arrays 的一些注意事项。
二、需要注意什么
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
这样使用,就和我们的预期是一样的了。
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 做操作,就需要再一次对其进行转换。
三、小结
Arrays.asList() 使用的坑基本上都已经说清楚了,并且也提供了解决的办法。
【本文为51CTO专栏作者“张旸”的原创稿件,转载请通过微信公众号联系作者获取授权】