版权声明:java
本帐号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影全部。数组
每周会统一更新到这里,若是喜欢,可关注公众号获取最新文章。bash
未经容许,不得转载。ui
若是有对于一些 Array 到 List 转换的须要的话,可能就须要用到 Arrays 这个类,它除了提供一些对数组的排序和搜索等操做以外,还提供了一些从 Array.asList()
这个很是方便的将 Array 转为为 List 的 Api ,可是它使用起来也有一些须要注意的地方。spa
本篇就简单介绍一下使用 Arrays 的一些注意事项。3d
asList()
能够将一个数组转换为咱们须要的 List。可是若是这个数组是一个基本数据类型的话,就会出现问题。code
举个例子:cdn
最终输出的结果是:blog
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复制代码
这样使用,就和咱们的预期是同样的了。
前面看了 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() 使用的坑基本上都已经说清楚了,而且也提供了解决的办法。
版权声明:
本帐号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影全部。
每周会统一更新到这里,若是喜欢,可关注公众号获取最新文章。
未经容许,不得转载。