Arrays.asList()使用中的问题

今天在项目中遇到一个小问题,代码抽象成这样:

String[] strs = new String[] { "aaa", "bbb", "ccc" };
List<String> asList = Arrays.asList(strs);
asList.add("FFF");
System.out.println(asList.toString());

结果他报了一个“不支持的操作”异常,异常的行数是asList.add("FFF");这一行:

Exception in thread "main" java.lang.UnsupportedOperationException

说明这个add()方法是不支持的!我们知道List接口是有定义add()方法的,那就是Arrays.asList(strs)返回的List的实现类没有去实现List的add()方法咯?看一下asList()方法的返回:
asList()方法的返回
他返回的是个Arrary$ArraryList,看看源码:

    @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

返回的是一个ArrayList<>,还跟我们平时用的ArrayList<>不太一样,那就看看这个ArrayList<>:
ArrayList<>的构造
吓得我赶紧去看看java.util.ArrayList<>,嗯,果然不是同一个。此处这个是Arrays类内部定义的一个内部类。这个类的成员只有这个private final E[] a; 看到这个final 就知道不用想了,什么add(),remove()之类的方法肯定是没有的。再看看构造方法:

private final E[] a;

ArrayList(E[] array) {
    a = Objects.requireNonNull(array);
}

这不就是个数组嘛。

下回面试再有人问你ArrayList<>的数据结构,就告诉他,ArrayList<>是一个定长数组,嗯,我说的是Arrays类里面的那个ArrayList<>

猜你喜欢

转载自blog.csdn.net/u012843361/article/details/83543208