Arrays.asList 有坑,千万别踩!

简介: 阿里巴巴Java开发规范说到使用工具类Arrays.asList()方法把数组转换成集合时,不能使用其修改集合相关的方法。因为它的add/remove/clear方法会抛出UnsupportedOperationException(),我们来看一下为什么会出现这种情况。

阿里巴巴Java开发规范说到使用工具类Arrays.asList()方法把数组转换成集合时,不能使用其修改集合相关的方法。


因为它的add/remove/clear方法会抛出UnsupportedOperationException(),我们来看一下为什么会出现这种情况。


问题分析


我们做个测试:

public static void main(String[] args) {
       List<String> list = Arrays.asList("a", "b", "c");
       // list.clear();
       // list.remove("a");
       // list.add("g");
}

被注释的三行可以分别解开注释,运行后确实出现了规约中所说的异常。我们来看下Arrays.asList()做了什么操作。

public static <T> List<T> asList(T... a) {
       return new ArrayList<>(a);
}

看上去是个很正常的方法,然而实际上你点进到ArrayList发现,其实ArrayList并不是我们平时用的ArrayList。

private static class ArrayList<E> extends AbstractList<E>
       implements RandomAccess, java.io.Serializable
   {
       private static final long serialVersionUID = -2764017481108945198L;
       private final E[] a;
       ArrayList(E[] array) {
           a = Objects.requireNonNull(array);
       }
       @Override
       public int size() {
           return a.length;
       }
       @Override
       public Object[] toArray() {
           return a.clone();
       }
       @Override
       @SuppressWarnings("unchecked")
       public <T> T[] toArray(T[] a) {
           int size = size();
           if (a.length < size)
               return Arrays.copyOf(this.a, size,
                                    (Class<? extends T[]>) a.getClass());
           System.arraycopy(this.a, 0, a, 0, size);
           if (a.length > size)
               a[size] = null;
           return a;
       }
       // 后面省略了

而是Arrays里面的一个内部类。

而且这个内部类没有add,clear,remove方法,所以抛出的异常其实来自于AbstractList。

public void add(int index, E element) {
       throw new UnsupportedOperationException();
}
public E remove(int index) {
      throw new UnsupportedOperationException();
}

点进去就会发现抛出异常的地方,clear底层也会调用到remove所以也会抛出异常。


总结


1、Arrays.asList()不要乱用,底层其实还是数组。


2、如果使用了Arrays.asList()的话,最好不要使用其集合的操作方法。


3、List list = new ArrayList<>(Arrays.asList("a", "b", "c"))可以在外面这样包一层真正的ArrayList。


数组转集合有很多方式,可以参考链接:


https://stackoverflow.com/questions/157944/create-arraylist-from-array


相关文章
|
机器学习/深度学习 Python
配置环境miniconda+pycharm【机器学习】
配置环境miniconda+pycharm【机器学习】
3263 0
IDEA 自定义注解(类注释、方法注释)
IDEA 自定义注解(类注释、方法注释)
7182 1
IDEA 自定义注解(类注释、方法注释)
|
XML SQL Java
IntelliJ IDEA 插件 MybatisX 在mapper和xml间跳转
IntelliJ IDEA 插件 MybatisX 在mapper和xml间跳转
4806 0
|
Java Spring
spring基于 注解的 AOP 的前后置通知,异常通知,最终通知,环绕通知
spring基于 注解的 AOP 的前后置通知,异常通知,最终通知,环绕通知
|
数据处理
OpenFeign 实践之 FeignClient 超时设置
OpenFeign 实践之 FeignClient 超时设置
4427 0
OpenFeign 实践之 FeignClient 超时设置
|
Java
Java 技巧篇-IntelliJ IDEA快捷键设置,格式化代码快捷键
Java 技巧篇-IntelliJ IDEA快捷键设置,格式化代码快捷键
3336 0
Java 技巧篇-IntelliJ IDEA快捷键设置,格式化代码快捷键
|
新零售 运维 搜索推荐
陈思淼:阿里6个月重写Lazada,再造“淘宝”的技术总结
2018 年 3 月,一则消息在朋友圈刷屏:阿里巴巴元老彭蕾卸任蚂蚁金服董事长,转而担任东南亚电商网站 Lazada 的 CEO,一时之间舆论纷纷。而在此之前,早在 2017 年 9 月,阿里集团管理层决定,启动 Voyager 项目,开始对 Lazada 的全系统改造,并且要在 2018 年 3 月底之前上线。
8226 0
|
IDE Java 开发工具
IntelliJ IDEA,代码行宽度超出限制时自动换行
转自:http://my.oschina.net/angerbaby/blog/471351 当我们使用IDE写代码时,为了保证代码的可阅读性和优雅性,通常会借助IDE的代码风格设置功能,令IDE智能完成的代码部分或者格式化输入的代码,可以按照预期的格式输出。
15094 3
|
Dubbo 应用服务中间件 Apache
Dubbo作者亲述:那些辉煌、沉寂与重生的故事
Dubbo 这个名字,最后会变成一个 Apache 的商标,会成为一个在 GitHub 上有 2 万多人关注、一百多人参与贡献的超级项目。
12238 0

热门文章

最新文章