Arrays.asList()方法的坑

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

public class TestAsList {
    public static void main(String[] args) {
        String[] s = {"a", "b", "c"};
        List<String> 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 <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

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


原因开始浮出水面

这个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<? extends E> c)
修改以后的代码:

public class TestAsList {
    public static void main(String[] args) {
        String[] s = {"a", "b", "c"};
        List<String> 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的

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,250评论 18 399
  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 6,235评论 0 3
  • 在经过一次没有准备的面试后,发现自己虽然写了两年的android代码,基础知识却忘的差不多了。这是程序员的大忌,没...
    猿来如痴阅读 8,041评论 3 10
  • 01. 当阿和在群上说出他和小咪分手消息的时候,群上哗然一片,面对群上丢出的种种疑惑,阿和却扔出一句: “我也很莫...
    BelieveAi阅读 2,187评论 0 0
  • 写作的理由 一、《送你一颗子弹》——刘瑜 (后记)http://rendaliuyu.blog.163.com/b...
    泛舟红尘阅读 2,823评论 0 0

友情链接更多精彩内容