java中將陣列轉換為集合,不能進行增刪操作解惑
阿新 • • 發佈:2019-01-04
</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沒有增刪方法。