Arrays.asList 有坑,千万别踩!

沙海 2021年6月8日04:39:36Java评论94字数 2763阅读9分12秒阅读模式
摘要

智能摘要

智能摘要文章源自JAVA秀-https://www.javaxiu.com/30183.html

阿里巴巴java开发规范说到使用工具类Arrays.asList()方法把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException(),我们来看一下为什么会出现这种情况。点进去就会发现抛出异常的地方,clear底层也会调用到remove所以也会抛出异常。如果使用了Arrays.asList()的话,最好不要使用其集合的操作方法。文章源自JAVA秀-https://www.javaxiu.com/30183.html

原文约 2726 | 图片 6 | 建议阅读 6 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/30183.html

Arrays.asList 有坑,千万别踩!

点击关注 ? Java基基 文章源自JAVA秀-https://www.javaxiu.com/30183.html

收录于话题文章源自JAVA秀-https://www.javaxiu.com/30183.html

#Java基基文章源自JAVA秀-https://www.javaxiu.com/30183.html

139个文章源自JAVA秀-https://www.javaxiu.com/30183.html

点击上方“Java基基”,选择“设为星标”文章源自JAVA秀-https://www.javaxiu.com/30183.html

做积极的人,而不是积极废人!文章源自JAVA秀-https://www.javaxiu.com/30183.html

文章源自JAVA秀-https://www.javaxiu.com/30183.html

源码精品专栏文章源自JAVA秀-https://www.javaxiu.com/30183.html

 文章源自JAVA秀-https://www.javaxiu.com/30183.html

文章源自JAVA秀-https://www.javaxiu.com/30183.html

来源:juejin.im/post/5d10e52ee51d454f6f16ec11文章源自JAVA秀-https://www.javaxiu.com/30183.html

  • 引语:文章源自JAVA秀-https://www.javaxiu.com/30183.html

  • 问题分析:文章源自JAVA秀-https://www.javaxiu.com/30183.html

  • 总结:文章源自JAVA秀-https://www.javaxiu.com/30183.html

Arrays.asList 有坑,千万别踩!文章源自JAVA秀-https://www.javaxiu.com/30183.html

本周第 3 个工作日,要好好加油。文章源自JAVA秀-https://www.javaxiu.com/30183.html

如果不是,好心疼,哈哈哈哈。文章源自JAVA秀-https://www.javaxiu.com/30183.html

本文比较简单,不过 80% 的 Java 程序员碰到过。文章源自JAVA秀-https://www.javaxiu.com/30183.html

引语:

阿里巴巴java开发规范说到使用工具类Arrays.asList()方法把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException(),我们来看一下为什么会出现这种情况。文章源自JAVA秀-https://www.javaxiu.com/30183.html

问题分析:

我们做个测试文章源自JAVA秀-https://www.javaxiu.com/30183.html

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

被注释的三行可以分别解开注释,运行后确实出现了规约中所说的异常。我们来看下Arrays.asList()做了什么操作。文章源自JAVA秀-https://www.javaxiu.com/30183.html

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

看上去是个很正常的方法,然而实际上你点进到ArrayList发现,其实ArrayList并不是我们平时用的ArrayList。文章源自JAVA秀-https://www.javaxiu.com/30183.html

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。文章源自JAVA秀-https://www.javaxiu.com/30183.html

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

点进去就会发现抛出异常的地方,clear底层也会调用到remove所以也会抛出异常。文章源自JAVA秀-https://www.javaxiu.com/30183.html

总结:

  1. Arrays.asList()不要乱用,底层其实还是数组。文章源自JAVA秀-https://www.javaxiu.com/30183.html

  2. 如果使用了Arrays.asList()的话,最好不要使用其集合的操作方法。文章源自JAVA秀-https://www.javaxiu.com/30183.html

  3. List list = new ArrayList<>(Arrays.asList("a", "b", "c"))可以在外面这样包一层真正的ArrayList。文章源自JAVA秀-https://www.javaxiu.com/30183.html

文章源自JAVA秀-https://www.javaxiu.com/30183.html

欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢文章源自JAVA秀-https://www.javaxiu.com/30183.html

Arrays.asList 有坑,千万别踩!文章源自JAVA秀-https://www.javaxiu.com/30183.html

已在知识星球更新源码解析如下:文章源自JAVA秀-https://www.javaxiu.com/30183.html

Arrays.asList 有坑,千万别踩!文章源自JAVA秀-https://www.javaxiu.com/30183.html

Arrays.asList 有坑,千万别踩!文章源自JAVA秀-https://www.javaxiu.com/30183.html

Arrays.asList 有坑,千万别踩!文章源自JAVA秀-https://www.javaxiu.com/30183.html

Arrays.asList 有坑,千万别踩!文章源自JAVA秀-https://www.javaxiu.com/30183.html

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。文章源自JAVA秀-https://www.javaxiu.com/30183.html

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。文章源自JAVA秀-https://www.javaxiu.com/30183.html

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。文章源自JAVA秀-https://www.javaxiu.com/30183.html

文章源自JAVA秀-https://www.javaxiu.com/30183.html

文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)
文章源自JAVA秀-https://www.javaxiu.com/30183.html

阅读原文文章源自JAVA秀-https://www.javaxiu.com/30183.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定