arrays中copyof_为什么阿里巴巴开发手册明确说明 Arrays.asList() 不能使用其修改方法?...

作者:我想问问天

来源:https://juejin.im/post/5d10e52ee51d454f6f16ec11

引语:

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

问题分析:

我们做个测试
public static void main(String[] args) {       Listlist = Arrays.asList("a", "b", "c");       // list.clear();       // list.remove("a");       // list.add("g");   }
被注释的三行可以分别解开注释,运行后确实出现了规约中所说的异常。我们来看下Arrays.asList()做了什么操作。
public static ListasList(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[] 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

如果喜欢本篇文章,欢迎转发、点赞。关注订阅号「Web项目聚集地」,回复「全栈」即可获取 2019 年最新 Java、Python、前端学习视频资源。


推荐阅读

1. 经常用 HashMap ?这 6 个问题回答下 !

2. 数据库这么多锁,能锁住小姐姐吗?

3. 小白也能看懂,30 分钟搭建个人博客!

4. 快来薅当当的羊毛 !

5. 聊一聊 Java 泛型中的通配符

6. 数据库不使用外键的 9 个理由

d558d6958257efcf19735c133b60dda1.png 喜欢文章,点个 在看   b996bcc2fc05d2a3f6067260dccc2b7b.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值