Arrays.asList的问题

2019-02-25  本文已影响4人  sunpy

问题1:Arrays.asList的结果不可修改

    public static void main(String[] args) throws Exception {   
        String[] arr = new String[]{"1", "2", null, "a", "b", "c"};
        List<String> list = Arrays.asList(arr);
        list.add("8");
        list.remove("a");
        
        for (String str : list) {
            System.out.println(str);
        }
    }

结果:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(Unknown Source)
    at java.util.AbstractList.add(Unknown Source)
    at HelloWorld.main(HelloWorld.java:9)

源码分析:

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

说明:传入可变长度参数,实际上就是自定义泛型T类型的数组a作为形参。

  # Arrays自定义的静态内部类ArrayList
   /**
     * @serial include
     */
    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);
        }

        .........
    }
    // 检查对象不为空
    public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

说明:使用传入的数组作为内部数组的初始化。

# add方法在AbstractList父类中出现。
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
    public boolean add(E e) {
        add(size(), e);
        return true;
    }

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

说明:Arrays自定义的静态内部类ArrayList根本就没有提供add方法。所以使用AbstractList抽象类实现的add方法抛出UnsupportedOperationException异常。


思考:
当修改数组的时候,那么同时Arrays.asList生成的List也将发生变化。原因:Arrays定义的静态内部类都是基于形参传入的数组。

上一篇下一篇

猜你喜欢

热点阅读