1. 程式人生 > >java中將陣列轉換為集合,不能進行增刪操作解惑

java中將陣列轉換為集合,不能進行增刪操作解惑

</pre>java中我們經常會使用Arrays.asList(陣列);將陣列轉換為List型別,但是卻不能對轉換後的List進行增刪。示例如下:<pre name="code" class="java">import java.util.*;
class  ArraysDemo
{
	public static void main(String[] args) 
	{
//		定義一個Sting型陣列
		String[] arr={"abc","abcde","desf","dfdf","fdfee"};
//		將陣列轉換為List集合
		List<String> list=Arrays.asList(arr);
//		獲取第一元素的值
		System.out.println(list.get(1));
//		增加元素
		list.add("test");
	}
}

執行結果:
abcde
Exception in thread "main" java.lang.UnsupportedOperationException
        at java.util.AbstractList.add(Unknown Source)
        at java.util.AbstractList.add(Unknown Source)
        at ArraysDemo.main(ArraysDemo.java:13)<pre name="code" class="java">執行結果報出了UnsuportedOperationException,查閱Arrays.asList()方法原始碼:
 @SafeVarargs
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

    /**
     * @serial include
     */
//定義私有內部靜態類,繼承了AbstractList虛類
    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) {
            if (array==null)
                throw new NullPointerException();
            a = array;
        }

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

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

        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;
        }

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

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

        public int indexOf(Object o) {
            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;
        }

        public boolean contains(Object o) {
            return indexOf(o) != -1;
        }
    }
從原始碼可以得知,Arrays內部實現了私有內部靜態類,而且沒有實現增刪的方法。所以通過asList()生成的List沒有增刪方法。