Java中,Arrays转List的那些坑

 一、前言

目前创新互联建站已为上1000+的企业提供了网站建设、域名、网页空间、网站托管、服务器托管、企业网站设计、永济网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

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

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

二、需要注意什么

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

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

举个例子:

最终输出的结果是:

 
 
 
 
  1. I/cxmyDev: list size : 1 

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

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

举个例子来说明问题。

 
 
 
 
  1. I/cxmyDev: list size : 1 
  2. I/cxmyDev: list.get(0) class : [I 
  3. I/cxmyDev: list type : true 

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

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

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

简单改写一个上面的 Demo。

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

 
 
 
 
  1. list size : 6  
  2. I/cxmyDev: list.get(0) class : java.lang.Integer  
  3. 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() 使用的坑基本上都已经说清楚了,并且也提供了解决的办法。

【本文为专栏作者“张旸”的原创稿件,转载请通过微信公众号联系作者获取授权】

本文名称:Java中,Arrays转List的那些坑
当前网址:http://www.hantingmc.com/qtweb/news49/80699.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联