现象
public class ArrayListTest {
public static void main(String[] args) {
List<Integer> a = Arrays.asList(1, 2);
a.add(3);
System.out.println(a);
}
}
会产生报错:
Exception in thread “main” java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at com.tutor.xiechao.javastudy.learnIOAndColletion.ArrayListTest.main(ArrayListTest.java:20)
分析
看一下源码:
/**
* Returns a fixed-size list backed by the specified array. (Changes to
* the returned list "write through" to the array.) This method acts
* as bridge between array-based and collection-based APIs, in
* combination with {@link Collection#toArray}. The returned list is
* serializable and implements {@link RandomAccess}.
*
* <p>This method also provides a convenient way to create a fixed-size
* list initialized to contain several elements:
* <pre>
* List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
* </pre>
*
* @param <T> the class of the objects in the array
* @param a the array by which the list will be backed
* @return a list view of the specified array
*/
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
Returns a fixed-size list backed by the specified array.
Arrays.asList 产生的是一个固定大小的数组。
一旦想要更改,就会报错UnsupportedOperationException
解决办法
使用new ArrayList<>(Arrays.asList(1, 2));
public class ArrayListTest {
public static void main(String[] args) {
List<Integer> a = new ArrayList<>(Arrays.asList(1, 2));
a.add(3);
System.out.println(a);
}
}
第一步探索
实际上,Collections.emptyList 和 Collections.singletonList (都返回不能修改大小的数组),这种方式其实可以用在固定大小的参数中,一旦不小心被传递出去,并且对其调用了add、addAll等方法,就可能会爆出这种UnsupportedOperationException。
但是其实可以利用这种方式,比如导数据的过程中,可能需要几种特定的数组(Arrays.asList(“success”,“failed”,“no_content”)),这个可以作为参数传递,保证不会在其他地方被修改。当然final也可以实现~