Arrays.asList()方法的坑

需求:快速将数组转化为集合,并且还能继续往里面添加元素
错误方法:
TestAsList.java

public class TestAsList {
    public static void main(String[] args) {
        String[] s = {"a", "b", "c"};
        List list =  Arrays.asList(s);

        System.out.println(list.toString());

        list.add("d");
    }
}

程序报错:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)
    at myjava.TestAsList.main(TestAsList.java:13)

为什么报错:
首先看方法的源代码

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

返回一个ArrayList,在Ctrl+B一下:


Arrays.asList()方法的坑_第1张图片
原因开始浮出水面

这个ArrayList并不是java.util.ArrayList,而是Arrays的一个内部类,它的add方法是在AbstractList类中,继续看源码:

 public boolean add(E e) {
     add(size(), e);
     return true;
}

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

定位到异常抛出处了
就是不能添加元素,你添加我就给你抛异常

解决方法:使用ArrayList的构造方法:public ArrayList(Collection c)
修改以后的代码:

public class TestAsList {
    public static void main(String[] args) {
        String[] s = {"a", "b", "c"};
        List strings1 = new ArrayList<>(Arrays.asList(s));
        strings1.add("d");
        System.out.println(strings1.toString());
    }
}

小结:我们不能对Arrays.asList()方法生成的ArrayList做修改数据结构的操作,比如add,再看remove()方法,也在AbstractList类中

public E remove(int index) {
    throw new UnsupportedOperationException();
}

抛出异常,不让改。但是对于不改变数据结构的操作,比如set方法

 public E set(int index, E element) {
     E oldValue = a[index];
     a[index] = element;
     return oldValue;
}

是完全oj8k的

你可能感兴趣的:(Arrays.asList()方法的坑)