Arrays.asList()与Collections.unmodifiableList()

发布时间 2023-06-26 13:54:09作者: economies

java.util.Arrays#asList

返回的是在Arrays实现的ArrayList,

 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) {
            int size = size();
            if (a.length < size)
                return Arrays.copyOf(this.a, size,
                                     (Class<? extends T[]>) a.getClass());
            System.arraycopy(this.a, 0, a, 0, size);
            if (a.length > size)
                a[size] = null;
            return 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) {
            E[] a = this.a;
            if (o == null) {
                for (int i = 0; i < a.length; i++)
                    if (a[i] == null)
                        return i;
            } else {
                for (int i = 0; i < a.length; i++)
                    if (o.equals(a[i]))
                        return i;
            }
            return -1;
        }

        @Override
        public boolean contains(Object o) {
            return indexOf(o) != -1;
        }

。。。。。。

继承了AbstractList,但并未覆写add方法

// AbstractList中的add方法,调用会抛出UnsupportedOperationException异常
public boolean add(E e) {
        add(size(), e);
        return true;
    }
public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }

但需注意 Arrays.asList()返回的List仅仅是不允许add,但依旧可以执行set,所以若需要保证List中元素不可变,还需调用java.util.Collections#unmodifiableList

java.util.Collections#unmodifiableList

该方法返回UnmodifiableList

static class UnmodifiableList<E> extends UnmodifiableCollection<E>
                                 implements List<E> {
       private static final long serialVersionUID = -283967356065247728L;

       final List<? extends E> list;

       UnmodifiableList(List<? extends E> list) {
           super(list);
           this.list = list;
       }

       public boolean equals(Object o) {return o == this || list.equals(o);}
       public int hashCode()           {return list.hashCode();}

       public E get(int index) {return list.get(index);}
       public E set(int index, E element) {
           throw new UnsupportedOperationException();
       }
       public void add(int index, E element) {
           throw new UnsupportedOperationException();
       }
       public E remove(int index) {
           throw new UnsupportedOperationException();
       }
       public int indexOf(Object o)            {return list.indexOf(o);}
       public int lastIndexOf(Object o)        {return list.lastIndexOf(o);}
       public boolean addAll(int index, Collection<? extends E> c) {
           throw new UnsupportedOperationException();
       }

       @Override
       public void replaceAll(UnaryOperator<E> operator) {
           throw new UnsupportedOperationException();
       }
       @Override
       public void sort(Comparator<? super E> c) {
           throw new UnsupportedOperationException();
       }

       public ListIterator<E> listIterator()   {return listIterator(0);}

。。。。。。

才能确保List中的元素不可变。

并且在声明变量时需 使用final,来确保List引用也不可变