asList和ArrayList不得不说的故事

asList和ArrayList不得不说的故事java

简介

提到集合类,ArrayList应该是用到的很是多的类了。这里的ArrayList是java.util.ArrayList,一般咱们怎么建立ArrayList呢?git

建立ArrayList

看下下面的例子:github

List<String> names = new ArrayList<>();

上面的方法建立了一个ArrayList,若是咱们须要向其中添加元素的话,须要再调用add方法。dom

一般咱们会使用一种更加简洁的办法来建立List:code

@Test
    public void testAsList(){
        List<String> names = Arrays.asList("alice", "bob", "jack");
        names.add("mark");

    }

看下asList方法的定义:继承

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

很好,使用Arrays.asList,咱们能够方便的建立ArrayList。接口

运行下上面的例子,奇怪的事情发生了,上面的例子竟然抛出了UnsupportedOperationException异常。element

java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)
    at com.flydean.AsListUsage.testAsList(AsListUsage.java:18)

UnsupportedOperationException

先讲一下这个异常,UnsupportedOperationException是一个运行时异常,一般用在某些类中并无实现接口的某些方法。get

为何上面的ArrayList调用add方法会抛异常呢?it

asList

咱们再来详细的看一下Arrays.asList方法中返回的ArrayList:

private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable

能够看到,Arrays.asList返回的ArrayList是Arrays类中的一个内部类,并非java.util.ArrayList。

这个类继承自AbstractList,在AbstractList中add方法是这样定义的:

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

好了,咱们的问题获得了解决。

转换

咱们使用Arrays.asList获得ArrayList以后,能不能将其转换成为java.util.ArrayList呢?答案是确定的。

咱们看下下面的例子:

@Test
    public void testList(){
        List<String> names = new ArrayList<>(Arrays.asList("alice", "bob", "jack"));
        names.add("mark");
    }

上面的例子能够正常执行。

总结

在java中有不少一样名字的类,咱们须要弄清楚他们究竟是什么,不要混淆了。

本文的例子https://github.com/ddean2009/learn-java-collections

欢迎关注个人公众号:程序那些事,更多精彩等着您!
更多内容请访问 www.flydean.com
相关文章
相关标签/搜索