使用工具類Arrays.asList()方法可以很方便的把數(shù)組轉(zhuǎn)換成集合
但是轉(zhuǎn)換后不能使用集合修改的相關(guān)方法 add/remove/clear等...
它的 add / remove / clear 方法會拋出 UnsupportedOperationException 異常。
asList 的返回對象是一個 Arrays 內(nèi)部類,并沒有實現(xiàn)集合的修改方法。 Arrays . asList
體現(xiàn)的是適配器模式,只是轉(zhuǎn)換接口,后臺的數(shù)據(jù)仍是數(shù)組。
Arrays.asList()的源碼
用
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
- 繼續(xù)看new ArrayList<>(a[])的源碼
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
- 可以看到,它只是判斷了一下array是否為null,然后直接把array的地址用 = 賦值給了a
- 所以,如果后面更改子列表的值,那么原數(shù)組的值也會發(fā)生變化哦
-
但是,后面對原列表的增加或刪除,均會導(dǎo)致子列表的增加刪除產(chǎn)生 ConcurrentModificationException異常
所以盡量不要在使用asList以后還去操作原列表
String[] str = new String[] { "you", "wu" };
List list = Arrays.asList(str);
第一種情況: list.add("yangguanbao"); 運行時異常。
第二種情況: str[0] = "gujin"; 那么 list.get(0) 也會隨之修改。