Java 中 ,Arrays 转 List 的那些坑

版权声明:

本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有。

每周会统一更新到这里,如果喜欢,可关注公众号获取最新文章。

未经允许,不得转载。

一、前言

如果有对于一些 Array 到 List 转换的需要的话,可能就需要用到 Arrays 这个类,它除了提供一些对数组的排序和搜索等操作之外,还提供了一些从 Array.asList() 这个非常方便的将 Array 转为为 List 的 Api ,但是它使用起来也有一些需要注意的地方。

本篇就简单介绍一下使用 Arrays 的一些注意事项。

二、需要注意什么

1、asList() 无法将基本类型转换为List

asList() 可以将一个数组转换为我们需要的 List。但是如果这个数组是一个基本数据类型的话,就会出现问题。

举个例子:

Java 中 ,Arrays 转 List 的那些坑_第1张图片
/arr-demo0.png

最终输出的结果是:

I/cxmyDev: list size : 1

这个结果和我们的预期是不符合的,先来看看 asList() 的实现源码。

Java 中 ,Arrays 转 List 的那些坑_第2张图片
/arr-aslist.png

可以看到 asList() 是接受一个泛型的变长参数的,而基本数据类型是无法被泛型化的。而对于泛型而言,基本数据类型,实际上会被人为是一个 [x 的类型。 [ 表示这是一个数组,x 为当前数组的类型。例如: int[] 实际上它的类型是 [I

举个例子来说明问题。

Java 中 ,Arrays 转 List 的那些坑_第3张图片
/arr-demo1.png
I/cxmyDev: list size : 1
I/cxmyDev: list.get(0) class : [I
I/cxmyDev: list type :true

可以看到,确实与前面介绍的一致。

所以,得出的结论就是,8 种基本数据类型,不能被用在方法的泛型变长参数中,否者会被人为是一个 [X 类型的参数,而不是可变长参数。

有时候又需要对这些基本数据类型进行操作,这个时候,就可以使用基本数据类型的包装类。

简单改写一个上面的 Demo。

Java 中 ,Arrays 转 List 的那些坑_第4张图片
/arr-demo2.png

再来看看输出的结果,验证一下。

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 的方法。

Java 中 ,Arrays 转 List 的那些坑_第5张图片
/arr-demo3.png

例如上面的代码,想在 asList() 返回的List 中,再插入一条数据,将会抛出 UnsupportedOperationException 这个异常。

Java 中 ,Arrays 转 List 的那些坑_第6张图片
/arr-crash.png

UnsupportedOperationException 这个异常,是在 AbstractList.add() 方法中抛出的。

Java 中 ,Arrays 转 List 的那些坑_第7张图片
/arr-excep.png

可以看到,如果继承了 AbstractList 而不去实现它对应的方法,调用就会抛出此异常。

如果需要使用 asList() 方法的话,就需要确保转换出来的 List 将不会再被修改,否者会抛出异常。

而如果想对 Arrays.asList() 转换的 ArrayList 做操作,就需要再一次对其进行转换。

Java 中 ,Arrays 转 List 的那些坑_第8张图片
/arr-demo4.png

三、小结

Arrays.asList() 使用的坑基本上都已经说清楚了,并且也提供了解决的办法。

版权声明:

本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有。

每周会统一更新到这里,如果喜欢,可关注公众号获取最新文章。

未经允许,不得转载。

Java 中 ,Arrays 转 List 的那些坑_第9张图片
公众号二维码.jpg

de

你可能感兴趣的:(Java 中 ,Arrays 转 List 的那些坑)