前言

最近在项目上线的时候发现一个问题,从后台报错日志看: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地址:https://bugs.java.com/view_bug.do?bug_id=6260652
那下面来试验下什么情况下会出现这种异常:

如上图,这种控制台打印的结果如下:
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中的坑就说到这里,有补充的欢迎留言。

Arrays.asList中所遇到的坑的更多相关文章

  1. Arrays.asList使用指南和一些坑(转)

    一.java.util.Arrays.asList() 的一般用法 List 是一种很有用的数据结构,如果需要将一个数组转换为 List 以便进行更丰富的操作的话,可以这么实现: String[] m ...

  2. Java之Arrays.asList陷阱

    Java.Util.Arrays可以将数组转换为List,具体的定义如下: @SafeVarargs public static <T> List<T> asList(T... ...

  3. java——Arrays.asList()方法

    Arrays.asList() 是将数组作为列表 问题来源于: public class Test { public static void main(String[] args) { int[] a ...

  4. Arrays类——Arrays.asList()方法使用

    java.util类 Arrays java.lang.Object——java.util.Arrays public class Arrays extends Object 此类包含用来操作数组(比 ...

  5. Arrays.asList的用法

    使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportOperationException异常说明: ...

  6. Java -- Arrays.asList()方法

    Arrays.asList() 是将数组作为列表 问题来源于: public class Test { public static void main(String[] args) { int[] a ...

  7. Arrays类--Arrays.asList()方法使用

    java.util类 Arrays java.lang.Object——java.util.Arrays public class Arrays extends Object 此类包含用来操作数组(比 ...

  8. Arrays.asList()方法的限制

    Arrays.asList()方法的限制是他对所产生的List类型做出了最理想的假设 package example; import java.util.Arrays; import java.uti ...

  9. JDK 之 Arrays.asList - 源码分析

    Arrays工具类提供了一个方法asList, 使用该方法可以将一个变长参数或者数组转换成List . 其源代码如下: @SafeVarargs public static <T> Lis ...

随机推荐

  1. Python高级正则

    import re p = re.compile("^[0-9]") m = p.match('13435aSAdb') print(m.group()) 一.上面的第二行和第三行 ...

  2. js自定义修改复选框单选框样式,清除复选框单选框默认样式

    之前做项目的时候,也遇到过需要按照设计稿把<input type="checkbox">和<input type="radio">的默认 ...

  3. Mq的介绍

    1.使用场景 异步处理 日志收集 流量削峰 应用解耦 2.通信协议 高级消息队列协议(AMQP). 参考文档:http://www.huangxiaobai.com/archives/1267

  4. 《Android进阶之光》--RxJava

    No1: RxJava使用 dependencies{ compile 'io.reactivex:rxjava:1.2.0' compile 'io.reactivex:rxandroid:1.2. ...

  5. TextInputLayout输入框验证

    <!-- 通过修改<color name="colorAccent">#023cfa</color>可以修改正确提示文本的颜色 添加<item ...

  6. 洛谷.1919.[模板]A*B Problem升级版(FFT)

    题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...

  7. [POI2014]Couriers

    OJ题号:BZOJ3524.BZOJ2223.洛谷3567 思路: 维护一颗可持久化权值线段树,记录每次加入数字时,不同数字出现的个数.对于每一个询问$[l,r]$,同时查询以$r$和$l-1$为根的 ...

  8. Wed 基础

    HTTP协议 www服务应用的默认端口为80 https加密服务的默认端口为443 常见状态码及其对应的作用 http://oldboy.blog.51cto.com/2561410/716294 2 ...

  9. Clion调试ROS包

    1. 安装 从官网下载最新版本的Clion https://www.jetbrains.com/clion/ 并解压到指定的目录,例如: /home/xkc/software/clion-2017.2 ...

  10. @property使用

    # coding:utf-8 """ property:负责把方法变成属性 """ class Student(object): def g ...