Arrays.asList方法将数组转成集合

数组和集合是用于存储对象的容器。它们可以相互转换。数组。aslist方法可用于传输集合。

==Arrays.asList==

可以在通过数组将数组转换为集合后更改集合数吗?Aslist方法?为了解决这个问题,我们直接给出了一些例子。

Arrays.asList方法将数组转成集合

运行结果:

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

 通过上面的例子,我们可以发现元素的值是通过set()方法修改的,并且原始数组的对应位置的值也被修改了,这表明修改后的值不是问题。然后,通过调用add()方法,直接抛出不支持的operationException异常,这表明无法执行任何操作来修改元素的数量。

那么为什么你不能改变元素的数量呢?输入array.aslist源代码以查看:

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

我们发现我们直接创建了一个arraylist对象。根据我们通常对arraylist的理解,我们应该能够修改元素的数量。原来这个数组列表不是我们通常使用的数组列表。它是arraylist,数组的静态内部类。

public class Arrays {
    ...
    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable{
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

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

        ...
    }
    ...
}

在数组的静态内部类arraylist中,set方法本质上修改数组的值,静态内部类arraylist不实现诸如add、remove和clear等方法。因此,当调用修改元素数的方法时,将引发不支持的OperationException异常。

另一个问题是,在上述情况下,我们通过set方法修改了arraylist集合的第一个元素的值。当我们访问原始数组的第一个位置时,值也发生了更改。为什么?

public class Arrays {
    ...
    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable{
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

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

        @Override
        public int size() {
            return a.length;
        }

        @Override
        public Object[] toArray() {
            return a.clone();
        }

        @Override
        @SuppressWarnings("unchecked")
        public <T> T[] toArray(T[] a) {
            ...
        }

        @Override
        public E get(int index) {
            return a[index];
        }

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

        @Override
        public int indexOf(Object o) {
            ...
        }

        @Override
        public boolean contains(Object o) {
            ...
        }

        @Override
        public Spliterator<E> spliterator() {
            ...
        }

        @Override
        public void forEach(Consumer<? super E> action) {
            ...
        }

        @Override
        public void replaceAll(UnaryOperator<E> operator) {
            ...
        }

        @Override
        public void sort(Comparator<? super E> c) {
            ...
        }
    }
    ...
}