博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Arrays.asList中所遇到的坑
阅读量:5931 次
发布时间:2019-06-19

本文共 1238 字,大约阅读时间需要 4 分钟。

前言

最近在项目上线的时候发现一个问题,从后台报错日志看:java.lang.UnsupportedOperationException异常

从代码定位来看,原来是使用了Arrays.asList()方法时把一个数组转化成List列表时,对得到的List列表进行add()和remove()操作, 所以导致了这个问题。

 

对于这个问题,现在来总结下,当然会总结Arrays下面的一些坑。

源代码分析

首先,遇到问题不可怕,遇到问题解决就是了,但是必须要保证下次不会再犯相同的问题。

Arrays.asList返回的是同样的ArrayList,为什么就不能使用add和remove方法呢?

1,查看Arrays.asList 源码

,

2,查看此ArrayList结构:

3, 在查看AbstractList结构:

果然,UnsupportedOperationException 是这里抛出的,因为Arrays中的ArrayList并没有实现此方法,故抛出了异常。

所以说 Arrays.asList 返回的 List 是一个不可变长度的列表,此列表不再具备原 List 的很多特性,因此慎用 Arrays.asList 方法。

Arrays中其他坑

1,下面程序输出是什么?

打印结果是:1
由上面asList 源码我们可以看到返回的 Arrays 的内部类 ArrayList 构造方法接收的是一个类型为 T 的数组,而基本类型是不能作为泛型参数的,所以这里参数 a 只能接收引用类型,自然为了编译通过编译器就把上面的 int[] 数组当做了一个引用参数,所以 size 为 1,要想修改这个问题很简单,将 int[] 换成 Integer[] 即可。所以原始类型不能作为 Arrays.asList 方法的参数,否则会被当做一个参数。

2,Collections.toArray报错问题

大家可以看下 java.util.ArrayList 源码 中特别标记有一句话如下:
Bug地址:
那下面来试验下什么情况下会出现这种异常:

如上图,这种控制台打印的结果如下:

class [Ljava.lang.String;
Exception in thread "main" java.lang.ArrayStoreException: java.lang.Object

我们查看Arrays中ArrayList的toArray源码:

因为asList返回的是一个String数组,所以这里toArray返回的其实是String[]类型,只不过是这里做了一个向上转型,将String[]类型转为Object[]类型罢了。
但是注意,虽然返回的引用为Object[],但实际的类型还是String[],当你往一个引用类型和实际类型不匹配的对象中添加元素时,就是报错。
具体大家可以参考Java向上转型和向下转型的相关知识点。

关于Arrays中的坑就说到这里,有补充的欢迎留言。

 

转载地址:http://jmktx.baihongyu.com/

你可能感兴趣的文章
如何对HashMap按键值排序
查看>>
test
查看>>
Unity小记
查看>>
IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm
查看>>
js/jquery/插件表单验证
查看>>
Bandwidth内存带宽測试工具
查看>>
为Node.js编写组件的几种方式
查看>>
(轉貼) Anders Hejlsberg談C#、Java和C++中的泛型 (.NET) (C#)
查看>>
30天敏捷结果(24):恢复你的精力
查看>>
JNI——访问数组
查看>>
C#开发和调用Web Service
查看>>
Android6.0机型上调用系统相机拍照返回的resultCode值始终等于0的问题
查看>>
全面理解Git
查看>>
JS敏感信息泄露:不容忽视的WEB漏洞
查看>>
让我们荡起双桨,Android 小船波浪动画
查看>>
ApacheCN 翻译活动进度公告 2019.2.18
查看>>
分布式memcached服务器代理magent安装配置(CentOS6.6)
查看>>
Create Volume 操作(Part III) - 每天5分钟玩转 OpenStack(52)
查看>>
物联网的广泛应用将扭转发展中经济体的局面 为全球发展带来新机遇
查看>>
Polar码引发舆论狂欢 5G标准远未定局
查看>>