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


相关文章
|
2月前
|
Java
CTO的严厉警告:慎用Arrays.asList与ArrayList.subList
【8月更文挑战第13天】在软件开发的世界里,每一个决定都可能对项目的成败产生深远影响。作为CTO,我时常需要站在技术战略的高度,审视团队中的每一个技术选择。今天,我想就两个常被误用或滥用的Java集合操作——Arrays.asList和ArrayList.subList——分享一些深刻的见解,希望能为工作学习中的技术同仁敲响警钟。
22 6
|
5月前
|
存储 Java 索引
【Java开发指南 | 第十六篇】Java数组及Arrays类
【Java开发指南 | 第十六篇】Java数组及Arrays类
29 3
|
11月前
|
Java API Apache
Arrays.asList():使用指南
Arrays.asList() 是一个 Java 的静态方法,它可以把一个数组或者多个参数转换成一个 List 集合。这个方法可以作为数组和集合之间的桥梁,方便我们使用集合的一些方法和特性。本文将给大家介绍 Arrays.asList() 的语法、应用场景、坑点和总结。
163 0
|
12月前
|
Java
Arrays.asList()方法 讲解
Arrays.asList()方法 讲解
92 0
|
12月前
|
Java 索引
CTO:在项目中使用Arrays.asList、ArrayList.subList,就立马滚
1. 使用Arrays.asList的注意事项 1.1 可能会踩的坑 先来看下Arrays.asList的使用:
|
Java
Java开发规范01 - 集合篇_Arrays.asList 坑
Java开发规范01 - 集合篇_Arrays.asList 坑
124 0
|
Java API
Arrays.asList注意事项
Arrays.asList注意事项
|
安全 Java API
Arrays.asList 解析
快速学习方法的定义 | 学习笔记
95 0
|
安全 Java
面试官:说说你对ArrayList的了解……
面试官:说说你对ArrayList的了解……
75 0