问题描述
在开发中常常需要将数组转为集合,在本次开发中就用到了Arrays.asList()方法将字符串转为集合。然而向转完之后的集合中添加元素、或者是改变集合结构,都会遇到图中的问题,我一时间也是很懵逼。

问题排查
那么问题就来了:这是为啥呢?我们顺着Arrarys.asList()这个方法一层一层往里找吧!当进入这个方法时,首先我们可以看到方法第一行注释:Returns a fixed-size list backed by the specified array。这行注释的大概意思就是:此方法返回一个基于特定数组的固定大小集合。再看看方法结构,方法的返回值是我们常见ArrayList。但是这个却不是我们常用的那个Java.util包下的ArrayList。此处的ArrayList是Arrays类的一个内部类。接着我们看到这个内部类也继承了AbstractList类,但是只继承部分方法,没有我们常用的ArrayList类中的add()、remove()等方法。所以当我们使用Arrarys.asList()声明的集合去添加元素或者改变集合结构时,会抛出java.lang.UnsupportedOperationException异常。此处可能也是对应了Returns a fixed-size list backed by the specified array这个注解,所以没有写入add等方法。这样常用的方法也是在不经意间才会发现问题,但只要深入研究一下,问题很快就能解决,毕竟读源码是一个好习惯。
解决方案
此处,我使用了一个简单的方式去解决这个问题,即使用流处理Collectors.toList()将对象转换为java.util下ArrayList。功能正常使用,这样简单又方便。

总结
虽然Arrays.asList方法不够完美,但是处理一些对象转换,使用我们常用的一些contains方法等都是不错的选择;但是如add()/remove()/clear()等方法不能使用,只要是修改被Arrays.asList声明的集合,就会报java.lang.UnsupportedOperationException异常。这也给我们一个启发,想要写出质量高的代码,写的时候就得考虑的多一点。
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/6236.html
