美文网首页
Arrays.asList的问题

Arrays.asList的问题

作者: sunpy | 来源:发表于2019-02-25 16:10 被阅读4次

    问题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定义的静态内部类都是基于形参传入的数组。

    相关文章

      网友评论

          本文标题:Arrays.asList的问题

          本文链接:https://www.haomeiwen.com/subject/vcrgyqtx.html