Arrays.asList的那些坑

导读:本篇文章讲解 Arrays.asList的那些坑,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Arrays.asList的那些坑


前言

阿里巴巴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://www.bmabk.com/index.php/post/97456.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!