Arrays.asList踩坑

2019/08/31 Java 集合

在 Arrays 中有一个静态方法 asList(),可以将数组转为 ArrayList。但是这个 ArrayList,和我们平常 new 出来的集合,有点不太一样,坑比较多。


add()

Arrays.asList() 返回的 ArrayList 对象,继承 AbstractList。且没有重写 add() 方法。AbstractList 对象的 add() 方法是不支持的操作。 所以 Arrays.asList() 返回的 ArrayList,不支持 remove() 方法。

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

remove()

Arrays.asList() 返回的 ArrayList 对象,继承 AbstractList。且没有重写 add() 方法。AbstractList 对象的 remove() 方法是不支持的操作。 所以 Arrays.asList() 返回的 ArrayList,不支持 remove() 方法。

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

clear()

Arrays.asList() 返回的 ArrayList 对象,继承 AbstractList。且没有重写 remove() 方法。AbstractList 对象的 clear() 方法实现中,有调用 remove() 方法。 所以 Arrays.asList() 返回的 ArrayList,不支持 clear() 方法。

    protected void removeRange(int fromIndex, int toIndex) {
        ListIterator<E> it = listIterator(fromIndex);
        for (int i=0, n=toIndex-fromIndex; i<n; i++) {
            it.next();
            it.remove();
        }
    }

基本类型数组当入参

我们先来看一段代码


    public static void main(String[] args) {
        int[] arr = {1,2,3,4};
        List integers = Arrays.asList(arr);
        System.out.println(integers);
    }

上述代码,输出是

[[I@52af6cff]

Array.asList(T… a) 源码我们可以看到返回的 Arrays 的内部类 ArrayList 构造方法接收的是一个类型为 T 的数组,而基本类型是不能作为泛型参数的,所以这里参数 a 只能接收引用类型。

而我们这里传入的是int[],基本数据类型 int 不是一个具体的对象T,所以这里的 a 其实是一个数组对象。

故我们传递进入的是一个数组对象,所以就把数组对象地址打印出来了。

要想修改这个问题很简单,将 int[] 换成 Integer[] 即可。所以原始类型不能作为 Arrays.asList 方法的参数,否则会被当做一个参数。

Search

    Table of Contents